python - 为什么未触发的赋值会改变“非本地”行为?
问题描述
今天我正在阅读 python 更改日志并遇到 nonlocal 关键字并对其进行了一些实验。我发现了一个令人困惑的情况,即未触发的赋值会改变nonlocal
关键字的行为,请参见下面的示例。
def a():
x = 'a'
def b():
def c():
nonlocal x
x = 'c'
c()
b()
print(x)
a()
>>> python3 test.py
c
def a():
x = 'a'
def b():
def c():
nonlocal x
x = 'c'
c()
if False:
x = 'b'
b()
print(x)
a()
>>> python3 test2.py
a
您可以在 中看到test2.py
,有一个未触发的分配x = 'b'
改变了非本地的行为。
为什么会这样?
解决方案
Python在编译时决定哪些变量是函数的本地变量。x
被分配到函数内部b
,所以它是本地的。在运行时实际上从未到达该分支是无关紧要的,并且通常无法确定。
因此,非本地的 in 是外部范围中的下x
一个,即 in 。c
x
b
替代方案会更令人惊讶 - 考虑一下如果if False:
改为is 会发生什么if rand(10) == 6:
。然后在第一次调用b
非局部变量时会引用最外面的变量,但在稍后调用b
它时会随机开始引用另一个!
推荐阅读
- node.js - 在 Windows Server 上使用 PM2 无法访问节点服务器
- python - Python实时绘图,重新更新
- sql - 从不同的列加入同一张表上的多个计数?
- java - 多线程应用Java中的PrioirtyBlockingQueue
- javascript - 如何仅将参数传递给需要它的中间件?
- excel - 如何在 Excel 单元格中查找相同字符的第二次出现
- android - 没有找到可以自动化 Chrome 的 Chrome 驱动程序
- permissions - 向特定用户打开共享文件夹
- javascript - 如何在谷歌地图和 Ajax 中使用分页
- cartopy - 无数据线运行图