2012-04-04 6 views
10

Ich habe Probleme, diesen Codecode auszuführen. Die Klasse ist Student, die einen IdCounter hat, und hier scheint das Problem zu liegen. (In Zeile 8)Zählervariable für Klasse

class Student: 
    idCounter = 0 
    def __init__(self): 
     self.gpa = 0 
     self.record = {} 
     # Each time I create a new student, the idCounter increment 
     idCounter += 1 
     self.name = 'Student {0}'.format(Student.idCounter) 

classRoster = [] # List of students 
for number in range(25): 
    newStudent = Student() 
    classRoster.append(newStudent) 
    print(newStudent.name) 

Ich versuche, diese idCounter in meinem Student Klasse zu haben, so kann ich es als Teil des Namens der Schüler (die wirklich eine ID # ist zum Beispiel Student 12345. Aber ich habe Fehler wurde immer.

Traceback (most recent call last): 
    File "/Users/yanwchan/Documents/test.py", line 13, in <module> 
    newStudent = Student() 
    File "/Users/yanwchan/Documents/test.py", line 8, in __init__ 
    idCounter += 1 
UnboundLocalError: local variable 'idCounter' referenced before assignment 

ich die idCounter + = 1 in vor, nach zu setzen versucht, alle Kombination, aber ich habe noch die referenced before assignment Störung erhalte, können Sie mir erklären, was ich falsch mache?

+1

Haben Sie die Zeile unmittelbar nach? –

+0

Warum ich nicht darüber nachgedacht habe ... (Ursprünglich schrieb mein Code 'Student.idCounter = 0') – George

+1

Abgesehen von dem speziellen Fehler, sind Inkremente in Python nicht atomar, so dass der naive Zähler Race-Bedingungen verursachen kann. Der bessere Weg wäre die Verwendung von 'itertools.count'. – bereal

Antwort

17
class Student: 
    # A student ID counter 
    idCounter = 0 
    def __init__(self): 
     self.gpa = 0 
     self.record = {} 
     # Each time I create a new student, the idCounter increment 
     Student.idCounter += 1 
     self.name = 'Student {0}'.format(Student.idCounter) 

classRoster = [] # List of students 
for number in range(25): 
    newStudent = Student() 
    classRoster.append(newStudent) 
    print(newStudent.name) 

Dank der Hinweis von Ignacio, Vazquez-Abrams, herausgefunden es ...

+0

Auch Beachten Sie, dass Ihr erster Kommentar grob ungenau ist. –

+0

Ja, eigentlich ist es nur ein Zähler und sonst nichts. (Ich weiß nicht, was ich dazu sagen soll, vielleicht sollte ich den Kommentar alle zusammen entfernen). Vielen Dank Ignacio Vazquez-Abrams. – George