Trong phạm vi Python, bất kỳ chuyển nhượng cho một biến chưa được công bố trong phạm vi đó tạo ra một biến địa phương mới trừ rằng biến được khai báo trước đó trong hàm như đề cập đến một biến scoped trên toàn cầu với từ khóa global
.
Hãy nhìn vào một phiên bản sửa đổi của mã giả của bạn để xem những gì sẽ 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ả các func_B
với biến tên x_local
và nó sẽ làm việc hệt.
Đơn đặt hàng chỉ quan trọng theo thứ tự các chức năng của bạn hoạt động thay đổi giá trị của toàn cầu x. Do đó, trong ví dụ của chúng tôi, đơn đặt hàng không quan trọng, kể từ func_B
cuộc gọi func_A
. Trong ví dụ này, đơn đặt hàng quan trọng:
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 chỉ cần sửa đổi global
để 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, 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
đang 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
một trong hai, nó tạo ra một bản sao cục bộ từ đó là chỉ định một giá trị.
Sự nhầm lẫn ở đây là lý do tại sao bạn không nên sử dụng biến toàn cục.
hãy cẩn thận cũng không giả sử chỉ vì bạn có một biến được gán trong hàm của bạn mà python sẽ xử lý các tham chiếu trước khi gán như vậy. Cho đến bài tập đầu tiên, nếu bạn sử dụng x, nó sẽ không phải là bài tập toàn cầu hoặc bài tập cục bộ. Bạn sẽ nhận được ngoại lệ UnboundLocalError khét tiếng trong khuôn mặt của bạn :) – osirisgothra