为什么 `if False` 后面的导入会产生局部变量?

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

以下代码按预期工作:

from os import name

def function():
    # if False:
    #     from os import name
    print(name)

function()

但是,当取消注释

if False
块时,代码停止工作:

UnboundLocalError:无法访问与值无关的局部变量

name

我想知道为什么会这样。从那以后我发现https://github.com/python/cpython/issues/79250#issuecomment-1093803068说这是“记录的行为”-我想知道where这是记录的,虽然。

python import scope
1个回答
0
投票

关于

UnboundLocalError
的这种行为在编程常见问题解答部分的官方文档中有最清楚的记录,标题为 当变量有值时我为什么会收到 UnboundLocalError?Python 语言参考手册中“执行模型”下的“命名和绑定”部分广泛介绍了与此相关的完整行为。具体为4.2.2节中的以下段落。名称解析,充分描述手头的问题:

当根本找不到名称时,将引发

NameError
异常。如果当前作用域是一个函数作用域,并且该名称引用了一个局部变量,该变量在使用该名称时尚未绑定到某个值,则会引发
UnboundLocalError
异常。

作为函数范围内的导入(即使尚未发生)将在

name
下提供一个新的局部变量,它成为一个局部变量,并且假设它在使用它的地方不受限制(通过
print 
),
UnboundLocalError
将是结果。

至于“为什么”——Python 没有对无法到达的分支进行优化,

if False
块后面的所有代码始终存在,因此对函数中某个名称的任何赋值都会使给定名称成为有效的局部变量。

顺便说一句,自 Python 2.7(或可能更早)以来,FAQ 条目就已存在

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