2012-04-04 4 views
10

У меня возникла проблема с запуском этой части кода. Класс - это Student, у которого есть IdCounter, и именно там проблема кажется. (В строке 8)Счетчик переменной для класса

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) 

Я пытаюсь, чтобы это idCounter внутри моего Student класса, так что я могу иметь его как часть имени студента (который действительно ID #, например Student 12345. Но у меня есть получаю ошибки.

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 

Я пытался поставить idCounter + = 1 в до, после, все комбинации, но я все еще получаю ошибку referenced before assignment, вы можете объяснить мне, что я делаю неправильно?

+1

Вы посмотрели на линию сразу после? –

+0

Почему я об этом не думал ... (Orginally мой код написал 'Student.idCounter = 0') – George

+1

Помимо конкретной ошибки, приращения не являются атомарными в Python, поэтому наивный счетчик может вызвать условия гонки. Лучшим способом было бы использовать 'itertools.count'. – bereal

ответ

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) 

Благодаря указанию Игнасио, Васкес-Абрамса, выяснилось ...

+0

Также , обратите внимание, что ваш первый комментарий является грубым неточным. –

+0

Да, на самом деле это просто счетчик и ничего больше. (Dont действительно знаю, что прокомментировать это, возможно, нужно просто удалить комментарий все вместе). Большое спасибо Игнасио Васкес-Абрамс. – George