python 3.x中的关闭和变量作用域引起我的困惑

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

我正在使用Python 3.7.0,并且正在做一些实验,以了解可变范围的细微差别,但我仍然不了解这种行为。

当我执行此代码时:

def f():
    x=0
    def g():y=x+1;x=y
    return g
f()()

我得到UnboundLocalError:分配前引用了局部变量'x'

但是,当我执行此命令时:

def f():
   x=0
   def g():y=x+1
   return g
f()()

效果很好。甚至这个:

def f():
   x=0
   def g():x=1
   return g
f()()

也可以。所以我很困惑。在我看来,如果在1函数中将值x分配给非局部变量g,则单独工作正常,另一方面,如果在表达式中将包含x的表达式分配给局部变量y功能g也可以正常工作,然后指令y=x+1x=y都应起作用。我不明白是什么导致了错误。我觉得我对Python行为的了解缺少一些基本知识。

python function variables scope closures
1个回答
0
投票

我会对此建议不明智。在以下代码中:

def f():
    x = 0  # assignment makes this x local to f()

    def g():
        y = x + 1
        x = y  # assignment makes this x local to g()

    return g

f()()

xg()的赋值强制其成为g()局部变量。因此,当您访问未分配的本地值时,第一行会导致错误。我相信这种“赋值使其局部化”的逻辑不会遵循程序的流程-将函数视为整体来确定,然后逐行查看代码。

您可以从函数访问作用域中的任何变量,但只能设置本地变量。除非您已声明变量,否则将其分配为globalnonlocal

def f():
    x = 0  # assignment makes this x local to f()

    def g():
        nonlocal x

        y = x + 1
        x = y  # x is declared to come from a nonlocal scope

    return g

f()()

在第二个示例中,这不是问题,因为您仅查看x的值,而不进行设置,因此它可以来自任何适当的范围:

def f():
    x = 0  # assignment makes this x local to f()

    def g():
        y = x + 1  # x comes from an outer scope

    return g

f()()

最后,您的第三个示例与第一个示例相同,没有未分配的局部变量使用错误:

def f():
    x = 0  # assignment makes this x local to f()

    def g():
        x = 1  # assignment makes this x local to g()

    return g

f()()

在我看来,如果将值1分配给非局部变量g函数中的x单独可以正常工作

您如何确定xf()的重新分配工作正常?

© www.soinside.com 2019 - 2024. All rights reserved.