2009-05-13 61 views
44

Trong Python Tôi nhận được lỗi sau:tham chiếu trước khi lỗi phân công trong python

UnboundLocalError: local variable 'total' referenced before assignment 

Vào lúc bắt đầu của tập tin (trước khi chức năng nơi sự lỗi xuất phát từ), tôi tuyên bố 'tổng' sử dụng từ khóa toàn cầu. Sau đó, trong phần thân của chương trình, trước khi hàm sử dụng 'tổng' được gọi, tôi gán nó cho 0. Tôi đã thử đặt nó thành 0 ở những nơi khác nhau (bao gồm phần đầu của tệp, ngay sau khi nó được khai báo), nhưng tôi không thể làm cho nó hoạt động được. Có ai nhìn thấy những gì tôi đang làm sai?

+4

Bạn có tuyên bố toàn cầu trong hàm? –

Trả lời

87

Tôi nghĩ bạn đang sử dụng 'toàn cục' không chính xác. Xem Python reference. Bạn nên khai báo biến không có global và sau đó bên trong hàm khi bạn muốn truy cập biến toàn cục, bạn khai báo nó global yourvar.

#!/usr/bin/python 

total 

def checkTotal(): 
    global total 
    total = 0 

Xem ví dụ này:

#!/usr/bin/env python 

total = 0 

def doA(): 
    # not accessing global total 
    total = 10 

def doB(): 
    global total 
    total = total + 1 

def checkTotal(): 
    # global total - not required as global is required 
    # only for assignment - thanks for comment Greg 
    print total 

def main(): 
    doA() 
    doB() 
    checkTotal() 

if __name__ == '__main__': 
    main() 

doA() không thay đổi toàn cầu tổng đầu ra là 1 không 11.

+20

Nó có thể là không có giá trị mà bạn chỉ cần từ khoá "toàn cầu" nếu bạn gán cho biến toàn cầu trong phạm vi địa phương. Vì vậy, trong ví dụ của bạn, khai báo chung là không cần thiết trong checkTotal(). –

+1

Câu trả lời toàn diện và phân tích đầy đủ về sự hiểu lầm thiết yếu đằng sau câu hỏi. –

+1

Tôi có nghĩa là nó có thể đáng chú ý * tất nhiên! Vẫn không thể chỉnh sửa các nhận xét mà không cần xóa-readd. :( –

1

Kịch bản của tôi

def example(): 
    cl = [0, 1] 
    def inner(): 
     #cl = [1, 2] //access this way will throw `reference before assignment` 
     cl[0] = 1 
     cl[1] = 2 //these won't 

    inner() 
+0

Đây là giải pháp tốt cho trang trí. ! – notalentgeek

Các vấn đề liên quan