2012-04-04 33 views
10

Bu kod parçasının çalıştırılması konusunda sorun yaşıyorum. Sınıf bir IdCounter'a sahip olan öğrencidir ve problemin olduğu yer burasıdır. (Hat 8'de)Sınıf için sayaç değişkeni

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) 

benim Student sınıf içinde bu idCounter sahip çalışıyorum, bu yüzden Student 12345 örneğin, gerçekten bir kimlik # olan öğrencinin adı (bir parçası olarak sahip olabilir. Ama var elde edilmiştir hatası.

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 

Ben idCounter koymak için çalıştı + = 1 önce, sonra, bütün kombinasyon, ama yine de referenced before assignment hatası alıyorum, sen yanlış yapıyorum bana açıklayabilir misin?

+1

Hemen izleyen çizgiye baktınız mı? –

+0

Neden böyle bir şey hakkında düşünmedim ... (Orjinal olarak benim kodum yazdı "Student.idCounter = 0') – George

+1

Belirli hatadan başka, artışlar Python'da atomik değildir, bu yüzden saf sayıcı yarış koşullarına neden olabilir. "Itertools.count" kullanmak daha iyi bir yol olurdu. – bereal

cevap

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) 

Ignacio, Vazquez-Abrams'ın belirttiği noktaya şükürler olsun ...

+0

Ayrıca , ilk yorumunuzun çok yanlış olduğunu unutmayın. –

+0

Evet, aslında sadece bir sayaç ve başka bir şey değil. (Üzerine ne yorum yapacağını gerçekten bilmiyorum, belki sadece yorumu birlikte kaldırmalıyız). Çok teşekkür ederim Ignacio Vazquez-Abrams. – George

İlgili konular