Chỉ để giúp bất kỳ sự nhầm lẫn nào cho độc giả trong tương lai, hãy để tôi giải thích những gì đang xảy ra đằng sau hậu trường ở đây. Trong mã của OP:
def run[]:
print var
if __name__ == '__main__':
var = 'yes'
run[]
def run[]:
print var # this line will fail, which is what we want
def main[]:
var = 'yes'
run[]
if __name__ == '__main__':
main[]
0 được khai báo ở cấp cao nhất của tệp và do đó def run[]:
print var # this line will fail, which is what we want
def main[]:
var = 'yes'
run[]
if __name__ == '__main__':
main[]
0 tự động trở thành biến toàn cầu.* Sau đó, def run[]:
print var # this line will fail, which is what we want
def main[]:
var = 'yes'
run[]
if __name__ == '__main__':
main[]
2 sẽ nhận thấy rằng def run[]:
print var # this line will fail, which is what we want
def main[]:
var = 'yes'
run[]
if __name__ == '__main__':
main[]
0 tồn tại trong phạm vi toàn cầu và nó sẽ chỉ đơn giản là in nó.Hành vi này thường không mong muốn* vì vậy giải pháp là tránh có ____10 là một biến toàn cầu. Để làm điều đó, chúng ta cần khai báo
def run[]:
print var # this line will fail, which is what we want
def main[]:
var = 'yes'
run[]
if __name__ == '__main__':
main[]
0 bên trong một hàm hoặc lớp. Một ví dụ:def run[]:
print var # this line will fail, which is what we want
def main[]:
var = 'yes'
run[]
if __name__ == '__main__':
main[]
Vì
def run[]:
print var # this line will fail, which is what we want
def main[]:
var = 'yes'
run[]
if __name__ == '__main__':
main[]
0 được khai báo bên trong một hàm, trong trường hợp này là def run[]:
print var # this line will fail, which is what we want
def main[]:
var = 'yes'
run[]
if __name__ == '__main__':
main[]
7, def run[]:
print var # this line will fail, which is what we want
def main[]:
var = 'yes'
run[]
if __name__ == '__main__':
main[]
0 chỉ tồn tại bên trong phạm vi địa phương của ____ 17. def run[]:
print var # this line will fail, which is what we want
def main[]:
var = 'yes'
run[]
if __name__ == '__main__':
main[]
2 sẽ nhận thấy rằng def run[]:
print var # this line will fail, which is what we want
def main[]:
var = 'yes'
run[]
if __name__ == '__main__':
main[]
0 không tồn tại bên trong phạm vi địa phương của chính nó hoặc trong phạm vi toàn cầu và nó sẽ thất bại.*Trong Python, bất kỳ biến nào được khai báo ở cấp cao nhất [có nghĩa là nó không được khai báo bên trong một hàm hoặc lớp, nó chỉ được mở] được coi là tự động được coi là một biến toàn cầu. Các biến toàn cầu có thể được truy cập từ bất cứ đâu. Điều này thường là không mong muốn. Đây là lý do tại sao các lập trình viên giỏi thường sẽ tránh viết mã cấp cao nhất và chỉ cần đặt tất cả mã của họ vào hàm chính [] hoặc các chức năng/lớp khác.
*Xem tại sao ở đây. Hoặc chỉ Google "Python tại sao các biến toàn cầu không mong muốn".
Trong hướng dẫn này, chúng ta sẽ tìm hiểu về các biến toàn cầu Python, các biến cục bộ và các biến không thuộc địa điểm với sự trợ giúp của các ví dụ.
VIDEO: Các biến số địa phương và toàn cầu của Python
Trong Python, chúng ta có thể khai báo các biến trong ba phạm vi khác nhau: phạm vi địa phương, phạm vi toàn cầu và không thuộc địa.
Một phạm vi biến chỉ định khu vực nơi chúng ta có thể truy cập một biến. Ví dụ,
def add_numbers[]:
sum = 5 + 4
Ở đây, biến tổng được tạo bên trong hàm, do đó nó chỉ có thể được truy cập trong nó [phạm vi cục bộ]. Loại biến này được gọi là biến cục bộ.
Dựa trên phạm vi, chúng ta có thể phân loại các biến Python thành ba loại:
- Các biến cục bộ
- Biến toàn cầu
- Biến không thuộc địa điểm
Python biến cục bộ
Khi chúng ta khai báo các biến bên trong một hàm, các biến này sẽ có phạm vi cục bộ [trong hàm]. Chúng ta không thể truy cập chúng bên ngoài chức năng.
Các loại biến này được gọi là biến cục bộ. Ví dụ,
def greet[]:
# local variable
message = 'Hello'
print['Local', message]
greet[]
# try to access message variable
# outside greet[] function
print[message]
Đầu ra
Local Hello NameError: name 'message' is not defined
Trong ví dụ trên, có hàm
def add_numbers[]:
sum = 5 + 4
6 lồng nhau. Chúng tôi đã sử dụng các từ khóa def add_numbers[]:
sum = 5 + 4
5 để tạo một biến không thuộc địa điểm.Hàm
def add_numbers[]:
sum = 5 + 4
6 được xác định trong phạm vi của một hàm khác def add_numbers[]:
sum = 5 + 4
9.Lưu ý: Nếu chúng tôi thay đổi giá trị của biến không thuộc địa, các thay đổi xuất hiện trong biến cục bộ.
Phạm vi của một biến trong một hàm là gì?
Nói một cách đơn giản, phạm vi của một biến là tuổi thọ của nó trong chương trình. Điều này có nghĩa là phạm vi của một biến là khối mã trong toàn bộ chương trình nơi biến được khai báo, sử dụng và có thể được sửa đổi. Trong phần tiếp theo, bạn sẽ tìm hiểu về phạm vi của các biến cục bộ.
Các loại phạm vi biến trong Python là gì?
# declare global variable
message = 'Hello'
def greet[]:
# declare local variable
print['Local', message]
greet[]
print['Global', message]
Đầu ra
Local Hello Global Hello
Lần này chúng ta có thể truy cập biến tin nhắn từ bên ngoài hàm
def add_numbers[]:
sum = 5 + 4
2. Điều này là do chúng tôi đã tạo biến tin nhắn là biến toàn cầu.# declare global variable
message = 'Hello'
Bây giờ, tin nhắn sẽ có thể truy cập được từ bất kỳ phạm vi [khu vực] của chương trình.
Python các biến không thuộc địa
Trong Python, các biến không thuộc địa được sử dụng trong các hàm lồng nhau có phạm vi cục bộ không được xác định. Điều này có nghĩa là biến có thể không ở trong địa phương cũng như phạm vi toàn cầu.
Chúng tôi sử dụng từ khóa
def add_numbers[]:
sum = 5 + 4
5 để tạo các biến không thuộc địa. Ví dụ, ví dụ,# outside function
def outer[]:
message = 'local'
# nested function
def inner[]:
# declare nonlocal variable
nonlocal message
message = 'nonlocal'
print["inner:", message]
inner[]
print["outer:", message]
outer[]
Đầu ra
inner: nonlocal outer: nonlocal
Trong ví dụ trên, có hàm
def add_numbers[]:
sum = 5 + 4
6 lồng nhau. Chúng tôi đã sử dụng các từ khóa def add_numbers[]:
sum = 5 + 4
5 để tạo một biến không thuộc địa điểm.Hàm
def add_numbers[]:
sum = 5 + 4
6 được xác định trong phạm vi của một hàm khác def add_numbers[]:
sum = 5 + 4
9.Lưu ý: Nếu chúng tôi thay đổi giá trị của biến không thuộc địa, các thay đổi xuất hiện trong biến cục bộ. : If we change the value of a nonlocal variable, the changes appear in the local variable.