Trong trường hợp thứ 2 dưới đây, Python cố gắng tìm kiếm một biến cục bộ. Khi nó không tìm thấy một, tại sao nó không thể nhìn vào phạm vi bên ngoài như nó làm cho trường hợp đầu tiên?
Điều này tìm kiếm X trong phạm vi cục bộ, sau đó phạm vi bên ngoài:
def f1[]:
x = 5
def f2[]:
print x
Điều này gây ra lỗi local variable 'x' referenced before assignment
:
def f1[]:
x = 5
def f2[]:
x+=1
Tôi không được phép sửa đổi chữ ký của hàm f2 [] để tôi không thể truyền và trả về các giá trị của x. Tuy nhiên, tôi cần một cách để sửa đổi x. Có cách nào để bảo Python tìm kiếm một tên biến trong phạm vi bên ngoài [một cái gì đó tương tự như từ khóa
def f1[]:
x = 5
def f2[]:
x+=1
0]?Phiên bản Python: 2.7
Hỏi ngày 16 tháng 8 năm 2012 lúc 12:41Aug 16, 2012 at 12:41
DharadharaDhara
6.4372 Huy hiệu vàng30 Huy hiệu bạc46 Huy hiệu Đồng2 gold badges30 silver badges46 bronze badges
5
Trong Python 3.x Điều này là có thể:
def f1[]:
x = 5
def f2[]:
nonlocal x
x+=1
return f2
Vấn đề và một giải pháp cho nó, cho Python 2.x, được đưa ra trong bài đăng này. Ngoài ra, vui lòng đọc PEP 3104 để biết thêm thông tin về chủ đề này.
Đã trả lời ngày 16 tháng 8 năm 2012 lúc 12:49Aug 16, 2012 at 12:49
Hochlhochlhochl
12k10 Huy hiệu vàng54 Huy hiệu bạc84 Huy hiệu đồng10 gold badges54 silver badges84 bronze badges
3
def f1[]:
x = { 'value': 5 }
def f2[]:
x['value'] += 1
Giải pháp thay thế là sử dụng một đối tượng có thể thay đổi và cập nhật các thành viên của đối tượng đó. Đôi khi ràng buộc tên là khó khăn trong Python.
Đã trả lời ngày 16 tháng 8 năm 2012 lúc 12:50Aug 16, 2012 at 12:50
Tom Whittocktom WhittockTom Whittock
4.03119 Huy hiệu bạc23 Huy hiệu đồng19 silver badges23 bronze badges
4
Trong Python và hầu hết các ngôn ngữ lập trình, các biến được khai báo bên ngoài một hàm được gọi là các biến toàn cầu. Bạn có thể truy cập các biến như vậy bên trong và bên ngoài một hàm, vì chúng có phạm vi toàn cầu. Đây là một ví dụ về biến toàn cầu: Biến x = 10
def showX[]:
print["The value of x is", x]
showX[]
# The value of x is 10
1 trong mã trên được khai báo bên ngoài hàm: def f1[]:
x = 5
def f2[]:
x+=1
2.def f1[]:
x = 5
def f2[]:
x+=1
Sử dụng chức năng
def f1[]:
x = 5
def f2[]:
x+=1
3, chúng tôi vẫn có thể truy cập def f1[]:
x = 5
def f2[]:
x+=1
1 vì nó được khai báo trong phạm vi toàn cầu.Chúng ta hãy xem một ví dụ khác cho thấy những gì xảy ra khi chúng ta khai báo một biến bên trong một hàm và cố gắng truy cập nó ở nơi khác.
def X[]:
x = 10
X[]
def showX[]:
print["The value of x is", x]
showX[]
NameError: name 'x' is not defined
Trong ví dụ trên, chúng tôi đã khai báo
def f1[]:
x = 5
def f2[]:
x+=1
1 bên trong một hàm và cố gắng truy cập nó trong một chức năng khác. Điều này dẫn đến một nameerror vì def f1[]:
x = 5
def f2[]:
x+=1
1 không được xác định trên toàn cầu.Các biến được xác định bên trong các hàm được gọi là biến cục bộ. Giá trị của chúng chỉ có thể được sử dụng trong hàm nơi chúng được khai báo.
Bạn có thể thay đổi phạm vi của biến cục bộ bằng cách sử dụng từ khóa
def f1[]:
x = 5
def f2[]:
x+=1
0 - mà chúng ta sẽ thảo luận trong phần tiếp theo.Từ khóa def f1[]:
x = 5
def f2[]:
x+=1
0 được sử dụng cho trong Python là gì?
def f1[]:
x = 5
def f2[]:
x+=1
Từ khóa toàn cầu chủ yếu được sử dụng vì hai lý do:
- Để sửa đổi giá trị của một biến toàn cầu.
- Để làm cho một biến cục bộ có thể truy cập bên ngoài phạm vi địa phương.
Hãy xem xét một số ví dụ cho từng kịch bản để giúp bạn hiểu rõ hơn.
Ví dụ #1 - Sửa đổi biến toàn cầu bằng cách sử dụng từ khóa def f1[]:
x = 5
def f2[]:
x+=1
0
def f1[]:
x = 5
def f2[]:
x+=1
Trong phần cuối cùng mà chúng tôi đã khai báo một biến toàn cầu, chúng tôi đã không cố gắng thay đổi giá trị của biến. Tất cả những gì chúng tôi đã làm là truy cập và in giá trị của nó trong một hàm.
Hãy thử và thay đổi giá trị của biến toàn cầu và xem điều gì sẽ xảy ra:
x = 10
def showX[]:
x = x + 2
print["The value of x is", x]
showX[]
# local variable 'x' referenced before assignment
Như bạn có thể thấy ở trên, khi chúng tôi cố gắng thêm 2 vào giá trị của
def f1[]:
x = 5
def f2[]:
x+=1
1, chúng tôi đã gặp lỗi. Điều này là do chúng tôi chỉ có thể truy cập nhưng không sửa đổi def f1[]:
x = 5
def f2[]:
x+=1
1.Để khắc phục điều đó, chúng tôi sử dụng biến
def f1[]:
x = 5
def f2[]:
x+=1
0. Đây là cách:x = 10
def showX[]:
global x
x = x + 2
print["The value of x is", x]
showX[]
# The value of x is 12
Sử dụng từ khóa
def f1[]:
x = 5
def f2[]:
x+=1
0 trong mã ở trên, chúng tôi có thể sửa đổi def f1[]:
x = 5
def f2[]:
x+=1
1 và thêm 2 vào giá trị ban đầu của nó.Ví dụ #2 - Cách thực hiện một biến cục bộ có thể truy cập bên ngoài phạm vi cục bộ bằng cách sử dụng từ khóa def f1[]:
x = 5
def f2[]:
x+=1
0
def f1[]:
x = 5
def f2[]:
x+=1
Khi chúng tôi tạo một biến bên trong một hàm, không thể sử dụng giá trị của nó bên trong một hàm khác vì trình biên dịch không nhận ra biến.
Đây là cách chúng tôi có thể khắc phục từ khóa
def f1[]:
x = 5
def f2[]:
x+=1
0:def X[]:
global x
x = 10
X[]
def showX[]:
print["The value of x is", x]
showX[]
# The value of x is 10
Để có thể truy cập
def f1[]:
x = 5
def f2[]:
x+=1
1 bên ngoài phạm vi cục bộ của nó, chúng tôi đã khai báo nó bằng cách sử dụng từ khóa def f1[]:
x = 5
def f2[]:
x+=1
0: def f1[]:
x = 5
def f2[]:
nonlocal x
x+=1
return f2
9.Sau đó, chúng tôi đã gán một giá trị cho
def f1[]:
x = 5
def f2[]:
x+=1
1. Sau đó chúng tôi đã gọi chức năng mà chúng tôi đã sử dụng để khai báo nó: def f1[]:
x = { 'value': 5 }
def f2[]:
x['value'] += 1
1Khi chúng tôi gọi hàm
def f1[]:
x = 5
def f2[]:
x+=1
3, in giá trị của def f1[]:
x = 5
def f2[]:
x+=1
1 được khai báo trong hàm def f1[]:
x = { 'value': 5 }
def f2[]:
x['value'] += 1
1, chúng tôi không gặp lỗi vì def f1[]:
x = 5
def f2[]:
x+=1
1 có phạm vi toàn cầu.Bản tóm tắt
Trong bài viết này, chúng tôi đã nói về các biến toàn cầu và địa phương trong Python.
Các ví dụ cho thấy cách khai báo cả biến toàn cầu và địa phương.
Chúng tôi cũng đã nói về từ khóa
def f1[]:
x = 5
def f2[]:
x+=1
0 cho phép bạn sửa đổi giá trị của biến toàn cầu hoặc làm cho biến cục bộ có thể truy cập được ngoài phạm vi của nó.Mã hóa hạnh phúc!
Học mã miễn phí. Chương trình giảng dạy nguồn mở của Freecodecamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu