繁体   English   中英

Python scope 当分配从未执行时

[英]Python scope when assignment never performed

所以我明白了

x = 5
def f():
    print(x)

f()
print(x)

返还 5 和 5。

我也明白

x = 5
def f():
    x = 7
    print(x)

f()
print(x)

返回 7 和 5。

以下有什么问题?

x = 5
def f():
    if False:
        x = 7   
        print(x)
    else:
        print(x)

f()
print(x)

我猜想由于x=7从未发生过,我应该再次得到 5 和 5。 相反,我得到

UnboundLocalError: local variable 'x' referenced before assignment

python 是否将x视为局部变量,因为在这个缩进块中,无论是否执行,都有一个赋值表达式? 具体是什么规则?

当定义 function 时,python 将x解释为局部变量,因为它是在 function 的主体内分配的。 在运行期间,当您 go 进入else子句时,解释器会查找未分配的局部变量x

如果您希望两个x都引用同一个变量,您可以在 function 的主体内添加global x ,然后在它分配之前基本上告诉 python当我调用x我将引用全局范围x

如果名称绑定操作发生在代码块中的任何位置,则块中名称的所有使用都被视为对当前块的引用。 如果在绑定之前在块中使用名称,这可能会导致错误。 这个规则很微妙。 Python 缺少声明,并允许名称绑定操作发生在代码块内的任何位置。 代码块的局部变量可以通过扫描块的整个文本以进行名称绑定操作来确定。

您需要在 function f()中使用global ,如下所示:

x = 5
def f():
    global x
    if False:
        x = 7   
        print(x)
    else:
        print(x)

f()
print(x)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM