2009-08-15 42 views
26

Biến toàn cầu hoạt động như thế nào trong Python? Tôi biết các biến toàn cầu là ác, tôi chỉ đang thử nghiệm.Tại sao tôi không thể đặt biến toàn cục bằng Python?

này không hoạt động trong python:

G = None 

def foo(): 
    if G is None: 
     G = 1 

foo() 

tôi nhận được một lỗi:

UnboundLocalError: local variable 'G' referenced before assignment 

Tôi đang làm gì sai?

Trả lời

56

Bạn cần global tuyên bố:

def foo(): 
    global G 
    if G is None: 
     G = 1 

Trong Python, biến mà bạn gán cho biến địa phương trở nên theo mặc định. Bạn cần sử dụng global để khai báo chúng dưới dạng biến toàn cục. Mặt khác, các biến mà bạn tham chiếu nhưng không gán cho không tự động trở thành biến cục bộ. Các biến này tham chiếu đến biến gần nhất trong phạm vi bao quanh.

Python 3.x giới thiệu câu lệnh nonlocal tương tự như global, nhưng liên kết biến với phạm vi bao quanh gần nhất. Ví dụ:

def foo(): 
    x = 5 
    def bar(): 
     nonlocal x 
     x = x * 2 
    bar() 
    return x 

Hàm này trả về 10 khi được gọi.

+0

s/biến/tên/g s/gán cho/liên kết với/g –

+1

Có, người ta có thể sử dụng thuật ngữ khác, nhưng miễn là Python tự nói về "biến" và "chuyển nhượng" trong thông báo lỗi (như xuất hiện trong câu hỏi ban đầu), tôi nghĩ thuật ngữ như vậy là hoàn toàn có thể chấp nhận được khi giải thích vấn đề. –

+0

Điểm được chụp! Tham chiếu ngôn ngữ không phải lúc nào cũng nhất quán về vấn đề này. –

6

Bạn vẫn phải khai báo G như toàn cầu, từ bên trong hàm:

G = None 

def foo(): 
    global G 
    if G is None: 
     G = 1 

foo() 
print G 

mà chỉ đơn giản kết quả đầu ra

1 
2

Xác định G như toàn cầu trong hàm như thế này:

#!/usr/bin/python 

G = None; 
def foo(): 
    global G 
    if G is None: 
     G = 1; 
    print G; 

foo(); 

Các trăn trên in 1.

Sử dụng các biến toàn cầu như thế này là xấu thực hành vì: http://c2.com/cgi/wiki?GlobalVariablesAreBad

8

Bạn cần phải tuyên bố G như global, nhưng đối với lý do: bất cứ khi nào bạn tham khảo một biến bên trong một hàm, nếu bạn thiết biến bất cứ nơi nào trong hàm đó, Python giả định rằng nó là một biến cục bộ. Vì vậy, nếu một biến địa phương theo tên đó không tồn tại tại thời điểm đó trong mã, bạn sẽ nhận được UnboundLocalError. Nếu bạn thực sự muốn nói đến một biến toàn cầu, như trong câu hỏi của bạn, bạn cần từ khóa global để cho Python biết đó là ý của bạn.

Nếu bạn không gán cho biến ở bất kỳ đâu trong hàm, nhưng chỉ truy cập vào giá trị của nó, Python sẽ sử dụng biến toàn cục theo tên đó nếu có. Vì vậy, bạn có thể làm:

G = None 

def foo(): 
    if G is None: 
     print G 

foo() 

Mã này in None và không ném UnboundLocalError.

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