Python - 访问在函数外部定义的函数内部变量时的意外行为

问题描述 投票:0回答:1

这导致

UnboundLocalError: cannot access local variable 'ans' where it is not associated with a value
.

def a():
    ans = 4
    
    def traverse():
        if ans == 2:
            pass
        
        if True:
            ans = 3

    traverse()
    print(ans)
    
a()

打印出 4:

def a():
    ans = 4
    
    def traverse():
        if ans == 2:
            pass

    traverse()
    print(ans)
    
a()

为什么在第二个代码中

ans == 2
行没有错误,但在第一种情况下有?

python python-3.x variables scope
1个回答
0
投票

在第一个示例中,

ans
被声明为
traverse
中的局部变量,但是因为这是在第一次访问之后,您会得到一个错误:

    def traverse():
        if ans == 2: # no local 'ans' exists yet!
            pass
        
        if True:
            ans = 3  # ans is a local var

在第二个例子中,

ans
内部没有对
traverse
的赋值,所以使用了外部作用域的变量:

    def traverse():
        if ans == 2:  # 'ans' refers to the outer scope
            pass

可能想要做的是声明

ans
nonlocal
,这样赋值修改非本地变量而不是在本地范围内创建一个新变量:

def a():
    ans = 4
    
    def traverse():
        nonlocal ans

        if ans == 2:
            pass
        
        if True:
            ans = 3

    traverse()
    print(ans)  # prints 3
    
a()
© www.soinside.com 2019 - 2024. All rights reserved.