2012-04-04 8 views
10

Tôi gặp sự cố khi nhận đoạn mã này để chạy. Lớp học là Sinh viên có một IdCounter, và nó là nơi mà vấn đề có vẻ là. (Tại dòng 8)Biến số lượt truy cập cho lớp

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) 

Tôi cố gắng để có idCounter này bên trong lớp Student tôi, vì vậy tôi có thể có nó như là một phần của tên của học sinh (mà thực sự là một ID #, ví dụ Student 12345. Nhưng tôi có được nhận được lỗi.

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 

tôi cố gắng để đưa các idCounter + = 1 vào trước, sau đó, tất cả kết hợp, nhưng tôi vẫn nhận được lỗi referenced before assignment, có thể giúp bạn giải thích cho tôi những gì tôi đang làm sai?

+1

Bạn đã xem dòng ngay sau? –

+0

Tại sao tôi không nghĩ về điều đó ... (Orginally mã của tôi đã viết 'Student.idCounter = 0') – George

+1

Ngoài lỗi cụ thể, gia số không phải là nguyên tử trong Python nên bộ đếm ngây thơ có thể gây ra điều kiện chủng tộc. Cách tốt hơn là sử dụng 'itertools.count'. – bereal

Trả lời

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) 

Nhờ vào điểm của Ignacio, Vazquez-Abrams, đã tìm ra nó ...

+0

Đồng thời , lưu ý rằng nhận xét đầu tiên của bạn là không chính xác. –

+0

Yea, thực sự nó chỉ là một truy cập và không có gì khác. (Không thực sự biết những gì để bình luận về nó, có lẽ nên chỉ cần loại bỏ các bình luận tất cả cùng nhau). Cảm ơn bạn rất nhiều Ignacio Vazquez-Abrams. – George