Bí quyết để hiểu điều này là khi bạn gán cho một biến, sử dụng =, bạn cũng khai báo nó dưới dạng biến cục bộ. Vì vậy, thay vì thay đổi giá trị của biến toàn cục a, setA (giá trị) thực sự đặt biến cục bộ (được gọi là a) thành giá trị được chuyển.
Điều này trở nên rõ ràng hơn nếu bạn cố gắng in giá trị một khi bắt đầu Seta (giá trị) như sau:
def setA(value):
print "Before assignment, a is %d" % (a)
a = value
print "Inside setA, a is now %d" % (a)
Nếu bạn cố gắng chạy Python này sẽ cung cấp cho bạn một lỗi hữu ích:
Traceback (most recent call last):
File "scopeTest.py", line 14, in
setA(42)
File "scopeTest.py", line 7, in setA
print "Before assignment, a is %d" % (a)
UnboundLocalError: local variable 'a' referenced before assignment
này cho chúng ta biết Python đã quyết định rằng Hàm setA (value) có một biến cục bộ được gọi là a, đó là những gì bạn thay đổi khi bạn ass bỏ qua nó trong hàm. Nếu bạn không gán cho một hàm trong hàm (như với printA()) thì Python sẽ sử dụng biến toàn cầu A.
Để đánh dấu một biến là toàn cầu bạn cần sử dụng từ khóa chung trong Python, trong phạm vi bạn muốn sử dụng biến toàn cục. Trong trường hợp này nằm trong hàm setA (value). Vì vậy, tập lệnh trở thành:
a = 7
def printA():
print "Value of a is %d" % (a)
def setA(value):
global a
a = value
print "Inside setA, a is now %d" %(a)
print "Before setA"
printA()
setA(42)
print "After setA"
printA()
Bổ sung một dòng này cho Python biết khi bạn sử dụng biến a trong hàm setA (giá trị) mà bạn đang nói về biến toàn cục, không phải biến cục bộ.
Nguồn
2009-05-30 14:17:00
* (thô lỗ từ) * python – theonlygusti