Mã này đưa ra lỗi:
>>> foo.func_code.co_nlocals
2
>>> foo.func_code.co_varnames
['prob', 'LINES']
9 Nhưng def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
0 được khởi tạo rõ ràng vì nếu tôi nhận xét dòng bên dưới câu lệnh in, nó không có lỗi và in def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
1 như mong đợi. Tôi không hiểu điều gì đó về Python ?? Những gì đang xảy ra ở đây?LINES = []
def foo[]:
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
if __name__ == "__main__":
foo[]
hỏi ngày 15 tháng 7 năm 2013 lúc 0:05Jul 15, 2013 at 0:05
Anthonybellanthonybellanthonybell
5.5307 Huy hiệu vàng41 Huy hiệu bạc59 Huy hiệu Đồng7 gold badges41 silver badges59 bronze badges
Bạn có thể truy cập biến toàn cầu từ bên trong
def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
2, nhưng bạn không thể sử dụng từ khóa def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
3Vì vậy, bạn có thể sử dụng
def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
4 hoặc def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
5 vì chúng chỉ đơn thuần là sửa đổi danh sách các dòng tham chiếu.Khi bạn cố gắng gán cho
def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
0 bằng cách sử dụng def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
7, Python biết rằng nó cần tạo một mục nhập cho các dòng trong các biến cục bộ các chức năng. Vì bạn đang cố gắng sử dụng def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
8 trước khi gán bất cứ điều gì cho biến cục bộ, nó gây ra lỗiBạn có thể kiểm tra
def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
2 như thế này>>> foo.func_code.co_nlocals
2
>>> foo.func_code.co_varnames
['prob', 'LINES']
Nếu bạn xác định
def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
2 một lần nữa mà không có def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
7, bạn sẽ thấy Python không còn đánh dấu nó là một biến cục bộ.Đã trả lời ngày 15 tháng 7 năm 2013 lúc 0:17Jul 15, 2013 at 0:17
John La Rooyjohn La RooyJohn La Rooy
Phù bằng vàng 287K5151 gold badges359 silver badges500 bronze badges
Bạn cần sử dụng từ khóa
def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
3:def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
Nếu không, Python sẽ nghĩ rằng
def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
0 là cục bộ và in ra giá trị trước khi đặt nó thành LINES = []
4 sẽ là một vấn đềBạn có thể nhận được giá trị của biến toàn cầu
def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
0 bằng cách in nó ra, nhưng khi bạn có câu lệnhLINES = []
trong đó cố gắng đặt
def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
0 thành một danh sách mới, Python diễn giải nó như một biến cục bộĐã trả lời ngày 15 tháng 7 năm 2013 lúc 0:07Jul 15, 2013 at 0:07
1
Như mong muốn đăng nhập,
Vì bạn gán cho các dòng trong hàm ví dụ của mình, Python biết không sử dụng biến toàn cầu, nhưng bạn cố gắng truy cập biến này trước khi bạn xác định nó.
Đây không phải là kết thúc, bạn có thể khắc phục điều này bằng cách sử dụng từ khóa toàn cầu, nói với Python rằng
def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
0 trong hàm giống như def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
0 bên ngoài hàm.Try:
LINES = []
def foo[]:
global lines
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
if __name__ == "__main__":
foo[]
Đã trả lời ngày 15 tháng 7 năm 2013 lúc 0:27Jul 15, 2013 at 0:27
CharmoniumqcharmoniumqcharmoniumQ
5.0544 Huy hiệu vàng30 Huy hiệu bạc49 Huy hiệu đồng4 gold badges30 silver badges49 bronze badges
Python trước tiên sẽ xem xét phạm vi hàm cho biến của bạn, trước khi nó nhìn vào phạm vi toàn cầu [cấp độ mô -đun]. Vì bạn gán cho
def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
0 trong chức năng ví dụ của mình, Python biết không sử dụng biến toàn cầu, nhưng bạn cố gắng truy cập biến này trước khi bạn xác định nó. Bạn nên khởi tạo def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
0 trước câu lệnh in hoặc bỏ câu lệnh def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
7.Đã trả lời ngày 15 tháng 7 năm 2013 lúc 0:20Jul 15, 2013 at 0:20
Biến toàn cầu
Trong Python, một biến được khai báo bên ngoài hàm hoặc trong phạm vi toàn cầu được gọi là biến toàn cầu. Điều này có nghĩa là một biến toàn cầu có thể được truy cập bên trong hoặc bên ngoài hàm.
Hãy xem một ví dụ về cách một biến toàn cầu được tạo ra trong Python.
Ví dụ 1: Tạo một biến toàn cầu
x = "global"
def foo[]:
print["x inside:", x]
foo[]
print["x outside:", x]
Đầu ra
x inside: global x outside: global
Trong mã trên, chúng tôi đã tạo X như một biến toàn cầu và xác định
LINES = []
def foo[]:
global lines
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
if __name__ == "__main__":
foo[]
2 để in biến x toàn cầu X. Cuối cùng, chúng tôi gọi LINES = []
def foo[]:
global lines
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
if __name__ == "__main__":
foo[]
2 sẽ in giá trị của x.Điều gì sẽ xảy ra nếu bạn muốn thay đổi giá trị của x bên trong một hàm?
x = "global"
def foo[]:
x = x * 2
print[x]
foo[]
Đầu ra
UnboundLocalError: local variable 'x' referenced before assignment
Đầu ra cho thấy một lỗi vì Python coi X là biến cục bộ và X cũng không được xác định bên trong
LINES = []
def foo[]:
global lines
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
if __name__ == "__main__":
foo[]
2.Để thực hiện công việc này, chúng tôi sử dụng từ khóa
def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
3. Truy cập từ khóa toàn cầu Python để tìm hiểu thêm.Các biến cục bộ
Một biến được khai báo bên trong cơ thể của hàm hoặc trong phạm vi cục bộ được gọi là biến cục bộ.
Ví dụ 2: Truy cập biến cục bộ bên ngoài phạm vi
def foo[]:
y = "local"
foo[]
print[y]
Đầu ra
>>> foo.func_code.co_nlocals
2
>>> foo.func_code.co_varnames
['prob', 'LINES']
0Đầu ra cho thấy một lỗi vì chúng tôi đang cố gắng truy cập một biến cục bộ y trong phạm vi toàn cầu trong khi biến cục bộ chỉ hoạt động bên trong
LINES = []
def foo[]:
global lines
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
if __name__ == "__main__":
foo[]
2 hoặc phạm vi cục bộ.Hãy xem một ví dụ về cách một biến cục bộ được tạo trong Python.
Ví dụ 3: Tạo một biến cục bộ
Thông thường, chúng tôi khai báo một biến bên trong hàm để tạo một biến cục bộ.
>>> foo.func_code.co_nlocals
2
>>> foo.func_code.co_varnames
['prob', 'LINES']
1Đầu ra
>>> foo.func_code.co_nlocals
2
>>> foo.func_code.co_varnames
['prob', 'LINES']
2Chúng ta hãy xem xét vấn đề trước đó trong đó X là một biến toàn cầu và chúng tôi muốn sửa đổi X bên trong
LINES = []
def foo[]:
global lines
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
if __name__ == "__main__":
foo[]
2.Các biến toàn cầu và địa phương
Ở đây, chúng tôi sẽ chỉ ra cách sử dụng các biến toàn cầu và các biến cục bộ trong cùng một mã.
Ví dụ 4: Sử dụng các biến toàn cầu và cục bộ trong cùng một mã
>>> foo.func_code.co_nlocals
2
>>> foo.func_code.co_varnames
['prob', 'LINES']
3Đầu ra
>>> foo.func_code.co_nlocals
2
>>> foo.func_code.co_varnames
['prob', 'LINES']
4Trong mã trên, chúng tôi tuyên bố X là toàn cầu và y là biến cục bộ trong
LINES = []
def foo[]:
global lines
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
if __name__ == "__main__":
foo[]
2. Sau đó, chúng tôi sử dụng toán tử nhân LINES = []
def foo[]:
global lines
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
if __name__ == "__main__":
foo[]
9 để sửa đổi biến toàn cầu X và chúng tôi in cả X và Y.Sau khi gọi
LINES = []
def foo[]:
global lines
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
if __name__ == "__main__":
foo[]
2, giá trị của X trở thành x = "global"
def foo[]:
print["x inside:", x]
foo[]
print["x outside:", x]
1 vì chúng tôi đã sử dụng x = "global"
def foo[]:
print["x inside:", x]
foo[]
print["x outside:", x]
2 để in hai lần def foo[]:
global LINES
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
3. Sau đó, chúng tôi in giá trị của biến cục bộ y i.e x = "global"
def foo[]:
print["x inside:", x]
foo[]
print["x outside:", x]
4.Ví dụ 5: Biến toàn cầu và biến cục bộ cùng tên
>>> foo.func_code.co_nlocals
2
>>> foo.func_code.co_varnames
['prob', 'LINES']
5Đầu ra
>>> foo.func_code.co_nlocals
2
>>> foo.func_code.co_varnames
['prob', 'LINES']
6Trong mã trên, chúng tôi đã sử dụng cùng tên X cho cả biến toàn cầu và biến cục bộ. Chúng tôi nhận được một kết quả khác khi chúng tôi in cùng một biến vì biến được khai báo trong cả hai phạm vi, tức là phạm vi cục bộ bên trong
LINES = []
def foo[]:
global lines
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
if __name__ == "__main__":
foo[]
2 và phạm vi toàn cầu bên ngoài LINES = []
def foo[]:
global lines
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
if __name__ == "__main__":
foo[]
2.Khi chúng tôi in biến bên trong
LINES = []
def foo[]:
global lines
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
if __name__ == "__main__":
foo[]
2, nó sẽ xuất ra x = "global"
def foo[]:
print["x inside:", x]
foo[]
print["x outside:", x]
8. Đây được gọi là phạm vi cục bộ của biến.Tương tự, khi chúng tôi in biến bên ngoài
LINES = []
def foo[]:
global lines
for prob in range[1,3]:
print "len[lines] = %d" % len[LINES]
LINES = []
if __name__ == "__main__":
foo[]
2, nó xuất ra toàn cầu X: 5. Đây được gọi là phạm vi toàn cầu của biến.Biến không thuộc địa điểm
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 ta hãy xem một ví dụ về cách một biến không địa điểm được sử dụng trong Python.
Chúng tôi sử dụng các từ khóa
x inside: global x outside: global0 để tạo các biến không thuộc địa.
Ví dụ 6: Tạo một biến không thuộc địa điểm
>>> foo.func_code.co_nlocals
2
>>> foo.func_code.co_varnames
['prob', 'LINES']
7Đầu ra
>>> foo.func_code.co_nlocals
2
>>> foo.func_code.co_varnames
['prob', 'LINES']
8Trong mã trên, có hàm
x inside: global x outside: global1 lồng nhau. Chúng tôi sử dụng các từ khóa
x inside: global x outside: global0 để tạo một biến không thuộc địa điểm. Hàm
x inside: global x outside: global1 được xác định trong phạm vi của một hàm khác
x inside: global x outside: global4.
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.