Hướng dẫn can python functions access outer variables? - các hàm python có thể truy cập các biến bên ngoài không?

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

Hướng dẫn can python functions access outer variables? - các hàm python có thể truy cập các biến bên ngoài không?

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

Hướng dẫn can python functions access outer variables? - các hàm python có thể truy cập các biến bên ngoài không?

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:

x = 10 

def showX():
    print("The value of x is", x)
    
showX()
# The value of x is 10

Biến

def f1():
    x = 5
    def f2():
        x+=1
1 trong mã trên được khai báo bên ngoài hàm:
def f1():
    x = 5
    def f2():
        x+=1
2.

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ì?

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

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

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
1

Khi 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

Bạn có thể truy cập một biến bên trong một chức năng Python không?

Bạn có thể truy cập các biến toàn cầu trong Python cả bên trong và bên ngoài hàm..

Chức năng bên trong có thể truy cập các biến chức năng bên ngoài?

Lưu ý rằng hàm DisplayName () không có biến cục bộ của riêng nó.Tuy nhiên, vì các hàm bên trong có quyền truy cập vào các biến của các hàm bên ngoài, DisplayName () có thể truy cập tên biến được khai báo trong hàm cha, init ().inner functions have access to the variables of outer functions, displayName() can access the variable name declared in the parent function, init() .

Hàm có thể sử dụng các biến được xác định bên ngoài hàm không?

Bạn có thể sử dụng các giá trị của các biến đó được xác định bên ngoài hàm (giả sử không có biến có cùng tên trong hàm).Tuy nhiên, điều này không được khuyến khích và nên tránh vì nó không rõ ràng với người đọc chương trình về định nghĩa của biến đó. (assuming there is no variable with the same name within the function). However, this is not encouraged and should be avoided since it becomes unclear to the reader of the program as to where that variable's definition is.