给定以下代码:
a = 0
def foo():
# global a
a += 1
foo()运行时,Python会报错: UnboundLocalError:局部变量'a‘在赋值之前被引用
然而,当它是一本字典的时候...
a = {}
def foo():
a['bar'] = 0
foo()它运行得很好..。
有人知道为什么我们可以在第二段代码中引用a,但不能引用第一段代码吗?
发布于 2010-08-20 04:40:00
不同之处在于,在第一个示例中,您将赋值给a,它将创建一个隐藏全局a的新本地名称a。
在第二个示例中,您没有对a进行赋值,因此使用了全局a。
documentation中介绍了这一点。
的一个特殊之处在于,如果没有有效的全局语句,则对名称的赋值总是进入最内部的作用域。
发布于 2010-08-20 04:39:52
问题是更新的问题。
无法更新a,因为它不是函数的本地命名空间中的变量。就地更新分配操作无法就地更新a。
有趣的是,a = a + 1也失败了。
Python为这类语句生成略微优化的代码。它使用"LOAD_FAST“指令。
2 0 LOAD_FAST 0 (a)
3 LOAD_CONST 1 (1)
6 INPLACE_ADD
7 STORE_FAST 0 (a)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE 请注意,在等号的左侧和右侧使用a可实现此优化。
但是,您可以访问a,因为Python将为您搜索本地和全局名称空间。
由于a不会出现在赋值语句的左侧,因此使用了另一种访问"LOAD_GLOBAL“。
2 0 LOAD_CONST 1 (0)
3 LOAD_GLOBAL 0 (a)
6 LOAD_CONST 2 ('bar')
9 STORE_SUBSCR
10 LOAD_CONST 0 (None)
13 RETURN_VALUE 发布于 2010-08-20 04:41:25
a += 1等同于a = a + 1。通过将其赋值给变量a,可以将其设为局部变量。您尝试分配a + 1的值失败,因为a尚未绑定。
https://stackoverflow.com/questions/3525985
复制相似问题