Trong phạm vi Python, bất kỳ sự gán nào cho một biến chưa được khai báo trong phạm vi đó sẽ tạo ra một biến cục bộ mới trừ khi biến đó được khai báo trước đó trong hàm khi tham chiếu đến một biến có phạm vi toàn cầu với từ khóa global
.
Hãy xem xét một phiên bản sửa đổi của mã giả của bạn để xem điều gì xảy ra:
# Here, we're creating a variable 'x', in the __main__ scope.
x = 'None!'
def func_A():
# The below declaration lets the function know that we
# mean the global 'x' when we refer to that variable, not
# any local one
global x
x = 'A'
return x
def func_B():
# Here, we are somewhat mislead. We're actually involving two different
# variables named 'x'. One is local to func_B, the other is global.
# By calling func_A(), we do two things: we're reassigning the value
# of the GLOBAL x as part of func_A, and then taking that same value
# since it's returned by func_A, and assigning it to a LOCAL variable
# named 'x'.
x = func_A() # look at this as: x_local = func_A()
# Here, we're assigning the value of 'B' to the LOCAL x.
x = 'B' # look at this as: x_local = 'B'
return x # look at this as: return x_local
Trong thực tế, bạn có thể viết lại tất cả func_B
với biến được đặt tên x_local
và nó sẽ hoạt động giống hệt nhau.
Thứ tự chỉ quan trọng theo thứ tự các hàm của bạn thực hiện các hoạt động thay đổi giá trị của x toàn cầu. Vì vậy, trong ví dụ của chúng tôi, thứ tự không quan trọng, vì func_B
các cuộc gọi func_A
. Trong ví dụ này, thứ tự không thành vấn đề:
def a():
global foo
foo = 'A'
def b():
global foo
foo = 'B'
b()
a()
print foo
# prints 'A' because a() was the last function to modify 'foo'.
Lưu ý rằng global
chỉ cần thiết để sửa đổi các đối tượng toàn cầu. Bạn vẫn có thể truy cập chúng từ bên trong một hàm mà không cần khai báo global
. Như vậy, chúng ta có:
x = 5
def access_only():
return x
# This returns whatever the global value of 'x' is
def modify():
global x
x = 'modified'
return x
# This function makes the global 'x' equal to 'modified', and then returns that value
def create_locally():
x = 'local!'
return x
# This function creates a new local variable named 'x', and sets it as 'local',
# and returns that. The global 'x' is untouched.
Lưu ý sự khác biệt giữa create_locally
và access_only
- access_only
là truy cập vào x toàn cầu mặc dù không gọi global
và mặc dù create_locally
không sử dụng global
, nhưng nó tạo ra một bản sao cục bộ kể từ khi gán giá trị.
Sự nhầm lẫn ở đây là lý do tại sao bạn không nên sử dụng các biến toàn cục.