Loại “tuổi thọ thay đổi” này được gọi là xác định phạm vi. Sau khi đọc bài viết này, bạn sẽ biết các quy tắc phạm vi của Python. Hãy bắt đầu
3 phạm vi của PythonPython có 3 phạm vi
- Toàn cầu. Trong phần chính của kịch bản. Theo mặc định, điều này đã chứa sẵn. Bạn có thể truy cập tất cả các biến toàn cầu với
Traceback [most recent call last]:
7
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment - Gửi kèm. Trong chức năng bên ngoài, nếu đây là một chức năng lồng nhau
- Địa phương. Trong chức năng hiện tại. Bạn có thể truy cập tất cả các biến cục bộ với
Traceback [most recent call last]:
8. Trong kịch bản chính,
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignmentTraceback [most recent call last]:
9
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment
Bạn có thể thấy cả ba hoạt động ở đây
Có một điểm quan trọng ở đây
Phạm vi của một biến được xác định tại thời điểm biên dịch
Vì lý do này, đoạn mã sau đưa ra một ngoại lệ
def foo[]:
print[min[[1, 2, 3]]]
min = lambda n: "local"foo[]
ném ngoại lệ
Traceback [most recent call last]:
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment
Tuyên bố “toàn cầu”
Bạn có thể gán giá trị cho biến toàn cục trong hàm bằng câu lệnh toàn cục
x = "global"def foo[]:
global x
x = "local"foo[]
print[x] # gives "local"
Tôi rất hiếm khi cần cái này. Để đảm bảo rằng tôi không nhầm lẫn bất cứ điều gì, tôi thích sử dụng từ điển
Traceback [most recent call last]:
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment
7. Trong trường hợp này, tôi thà sử dụngx = "global"def foo[]:
globals[]["x"] = "local"foo[]
print[x] # gives "local"
Tuyên bố "phi cục bộ"
Bạn có thể gán một giá trị cho một biến kèm theo với câu lệnh không cục bộ
________số 8Ví dụ khó hiểu
Hình ảnh của wokandapix [nguồn]
Nối phần tử so với '+= [phần tử]'
xs = []def foo[]:
xs.append[42] # OKfoo[]
so với
Traceback [most recent call last]:
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment
0Lý do tại sao cái đầu tiên hoạt động nhưng cái thứ hai không hoạt động là cái đầu tiên gọi một hàm của xs. Nó không bao giờ gán giá trị cho xs. Cái thứ hai bằng
Traceback [most recent call last]:
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment
1Khi Python phân tích cú pháp gán
x = "global"def foo[]:1 ,
global x
x = "local"foo[]
print[x] # gives "local"
x = "global"def foo[]:2 được gán phạm vi cục bộ. Nhưng trong phạm vi cục bộ,
global x
x = "local"foo[]
print[x] # gives "local"
x = "global"def foo[]:2 không tồn tại trước khi
global x
x = "local"foo[]
print[x] # gives "local"
x = "global"def foo[]:4 được thực thi. Do đó lỗi
global x
x = "local"foo[]
print[x] # gives "local"
Trong ví dụ đầu tiên với
x = "global"def foo[]:5 , phạm vi toàn cầu của
global x
x = "local"foo[]
print[x] # gives "local"
x = "global"def foo[]:2 được sử dụng. Do đó, chúng tôi không gặp phải bất kỳ vấn đề nào, vì nó được xác định trong phạm vi toàn cầu
global x
x = "local"foo[]
print[x] # gives "local"
Phạm vi toàn cầu KHÔNG quay trở lại tích hợp sẵn
Traceback [most recent call last]:
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment
8nhưng điều tương tự không hoạt động trong phạm vi cục bộ
Traceback [most recent call last]:
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment
9Lý do là
Traceback [most recent call last]:
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment
9 trong phạm vi toàn cầu. Mặc dù các phần mềm tích hợp hơi đặc biệt, nhưng chúng tồn tại trong phạm vi toàn cầuPhân công
Điều này gây nhầm lẫn cho những người có nền tảng Java, C hoặc C ++. Đây là mã Python hợp lệ
Traceback [most recent call last]:
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment
0Nhưng trong Java bạn cần khai báo nó trước để có thể sử dụng biến sau vòng lặp
Traceback [most recent call last]:
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment
1mypy
mypy là một trình kiểm tra kiểu phổ biến cho Python
Traceback [most recent call last]:
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment
2Vì vậy, mypy không thích việc bạn gán chuỗi “foo” cho
x = "global"def foo[]:8, bởi vì lần đầu tiên đọc nó lấy đường dẫn
global x
x = "local"foo[]
print[x] # gives "local"
x = "global"def foo[]:9 và giả định rằng
global x
x = "local"foo[]
print[x] # gives "local"
x = "global"def foo[]:8 sẽ là một số nguyên
global x
x = "local"foo[]
print[x] # gives "local"
Sau đó, bạn có thể muốn làm điều này
Traceback [most recent call last]:
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment
3Bạn có thể thấy rằng mypy cho rằng
x = "global"def foo[]:8 phải cùng loại trong cả hai trường hợp. Điều đó hợp lý vì nếu không thì phân tích sau đây có thể trở nên cực kỳ phức tạp
global x
x = "local"foo[]
print[x] # gives "local"
Lần thử tiếp theo có thể là
Traceback [most recent call last]:
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment
4Điều đó nên đã được mong đợi. Không thể gán
x = "global"def foo[]:2 cho một loại không bao gồm
globals[]["x"] = "local"foo[]
print[x] # gives "local"
x = "global"def foo[]:2 — và việc thêm
globals[]["x"] = "local"foo[]
print[x] # gives "local"
x = "global"def foo[]:2 vào loại đó có thể gây ra nhiều vấn đề khác sau này
globals[]["x"] = "local"foo[]
print[x] # gives "local"
Bạn có thể làm được việc này
Traceback [most recent call last]:
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment
5Nhưng tôi cũng có thể thấy khi điều này cảm thấy lạ. Cái này có thể sạch hơn
Traceback [most recent call last]:
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment
6Bản tóm tắt
Chúng ta đã thấy ba loại phạm vi trong Python. Cục bộ, kèm theo và toàn cầu. Chúng tôi đã thấy rằng bạn có thể truy cập toàn cầu bằng từ khóa
x = "global"def foo[]:5 hoặc qua từ điển
globals[]["x"] = "local"foo[]
print[x] # gives "local"
Traceback [most recent call last]:
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment
7. Các địa phương có thể được truy cập bằng từ điển Traceback [most recent call last]:
File "example.py", line 5, in
foo[]
File "example.py", line 2, in foo
print[min[[1, 2, 3]]]
UnboundLocalError: local variable 'min' referenced before assignment
8 và các biến kèm theo với từ khóa x = "global"def foo[]:8. Hãy ghi nhớ điều đó và phạm vi Python sẽ có ý nghĩa 🙂
globals[]["x"] = "local"foo[]
print[x] # gives "local"