2012-04-04 13 views
10

Tengo problemas para ejecutar este código. La clase es Estudiante que tiene un IdCounter, y es donde parece que está el problema. (En la línea 8)Variable de contador para la clase

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) 

Estoy tratando de tener esta idCounter dentro de mi clase Student, lo que puede tener como parte del nombre del estudiante (que en realidad es un número de identificación, por ejemplo Student 12345. Pero tengo estado recibiendo error.

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 

traté de poner el idCounter + = 1 en antes, después, todas las combinaciones, pero todavía estoy consiguiendo el error referenced before assignment, se puede explicar a mí lo que estoy haciendo mal?

+1

¿Ha mirado la línea que sigue inmediatamente? –

+0

Por qué no he pensado en eso ... (Originalmente mi código escribió 'Student.idCounter = 0') – George

+1

Aparte del error en particular, los incrementos no son atómicos en Python por lo que el contador ingenuo puede causar condiciones de carrera. La mejor forma sería usar 'itertools.count'. – bereal

Respuesta

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) 

Gracias al comentario de Ignacio, Vázquez-Abrams, lo descubrió ...

+0

También , tenga en cuenta que su primer comentario es muy inexacto. –

+0

Sí, en realidad es solo un mostrador y nada más. (Realmente no sé qué comentar sobre él, tal vez debería simplemente eliminar el comentario todos juntos). Muchas gracias Ignacio Vazquez-Abrams. – George

Cuestiones relacionadas