Nếu tôi tạo một biến toàn cục trong một hàm, làm thế nào tôi có thể sử dụng biến đó trong một hàm khác?
Chúng ta có thể tạo một toàn cầu với chức năng sau:
def create_global_variable():
global global_variable # must declare it to be a global first
# modifications are thus reflected on the module's global scope
global_variable = 'Foo'
Viết một hàm không thực sự chạy mã của nó. Vì vậy, chúng tôi gọi create_global_variable
chức năng:
>>> create_global_variable()
Sử dụng toàn cầu mà không sửa đổi
Bạn chỉ có thể sử dụng nó, miễn là bạn không muốn thay đổi đối tượng mà nó trỏ đến:
Ví dụ,
def use_global_variable():
return global_variable + '!!!'
và bây giờ chúng ta có thể sử dụng biến toàn cục:
>>> use_global_variable()
'Foo!!!'
Sửa đổi biến toàn cục từ bên trong một hàm
Để trỏ biến toàn cục vào một đối tượng khác, bạn bắt buộc phải sử dụng lại từ khóa toàn cầu:
def change_global_variable():
global global_variable
global_variable = 'Bar'
Lưu ý rằng sau khi viết hàm này, mã thực sự thay đổi vẫn không chạy:
>>> use_global_variable()
'Foo!!!'
Vì vậy, sau khi gọi hàm:
>>> change_global_variable()
chúng ta có thể thấy rằng biến toàn cục đã được thay đổi. Các global_variable
tên tại điểm đến 'Bar'
:
>>> use_global_variable()
'Bar!!!'
Lưu ý rằng "toàn cầu" trong Python không thực sự toàn cầu - nó chỉ toàn cầu ở cấp độ mô-đun. Vì vậy, nó chỉ có sẵn cho các chức năng được viết trong các mô-đun mà nó là toàn cầu. Các hàm nhớ mô-đun mà chúng được viết, vì vậy khi chúng được xuất sang các mô-đun khác, chúng vẫn tìm trong mô-đun mà chúng được tạo để tìm các biến toàn cục.
Biến cục bộ có cùng tên
Nếu bạn tạo một biến cục bộ có cùng tên, nó sẽ làm lu mờ một biến toàn cục:
def use_local_with_same_name_as_global():
# bad name for a local variable, though.
global_variable = 'Baz'
return global_variable + '!!!'
>>> use_local_with_same_name_as_global()
'Baz!!!'
Nhưng sử dụng biến cục bộ được đặt tên sai đó không làm thay đổi biến toàn cục:
>>> use_global_variable()
'Bar!!!'
Lưu ý rằng bạn nên tránh sử dụng các biến cục bộ có cùng tên với toàn cầu trừ khi bạn biết chính xác những gì bạn đang làm và có lý do rất chính đáng để làm như vậy. Tôi chưa gặp phải một lý do như vậy.
Chúng tôi có hành vi tương tự trong các lớp học
Theo dõi trên bình luận hỏi:
Phải làm gì nếu tôi muốn tạo một biến toàn cục bên trong một hàm bên trong một lớp và muốn sử dụng biến đó bên trong một hàm khác bên trong một lớp khác?
Ở đây tôi chứng minh chúng ta có hành vi tương tự trong các phương thức như chúng ta làm trong các hàm thông thường:
class Foo:
def foo(self):
global global_variable
global_variable = 'Foo'
class Bar:
def bar(self):
return global_variable + '!!!'
Foo().foo()
Và bây giờ:
>>> Bar().bar()
'Foo!!!'
Nhưng tôi sẽ đề nghị thay vì sử dụng các biến toàn cục mà bạn sử dụng các thuộc tính lớp, để tránh làm lộn xộn không gian tên mô-đun. Cũng lưu ý rằng chúng tôi không sử dụng các self
đối số ở đây - đây có thể là các phương thức lớp (tiện dụng nếu thay đổi thuộc tính lớp từ cls
đối số thông thường ) hoặc phương thức tĩnh (không self
hoặc cls
).