Python局部变量表现得很奇怪

时间:2017-09-09 19:29:04

标签: python scope

请考虑以下代码:

{0: 0}
{0: 0}

执行时提供以下输出:

b

但是如果我尝试更新f()中的def g(): a = {} b = 0 def f(): a[0] = b b+=1 f() print(a) return a a = g() print(a) ,就像在

中一样
UnboundLocalError: local variable 'b' referenced before assignment

它会抛出以下错误:

b

这是预期的吗?我需要在f()内更新OneFragment。这不可能吗?

2 个答案:

答案 0 :(得分:2)

明确地将ab传递给您的函数。

def g():
    a = {}
    b = 0
    def f(a, b):
        a[0] = b
        b += 1
        return b
    b = f(a, b)
    return a

答案 1 :(得分:1)

您需要使用nonlocal关键字:

def g():
    a = {}
    b = 0
    def f():
        nonlocal b
        a[0] = b
        b+=1
    f()
    print(a)
    return a
a = g()
print(a)

这是因为b += 1等于b = b + 1,因此您在函数b内分配f()。即使它稍后在代码中,这将使它成为整个 f()函数的局部变量,因此a[0] = b将引用本地b尚未定义。使用nonlocal告诉解释器已经有一个变量b,它应该在函数中使用,而不是创建一个新的局部变量。