首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python变量解析

Python变量解析
EN

Stack Overflow用户
提问于 2010-08-20 04:35:57
回答 4查看 110关注 0票数 6

给定以下代码:

代码语言:javascript
复制
a = 0
def foo():
  # global a
  a += 1
foo()

运行时,Python会报错: UnboundLocalError:局部变量'a‘在赋值之前被引用

然而,当它是一本字典的时候...

代码语言:javascript
复制
a = {}
def foo():
  a['bar'] = 0
foo()

它运行得很好..。

有人知道为什么我们可以在第二段代码中引用a,但不能引用第一段代码吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-20 04:40:00

不同之处在于,在第一个示例中,您将赋值给a,它将创建一个隐藏全局a的新本地名称a

在第二个示例中,您没有对a进行赋值,因此使用了全局a

documentation中介绍了这一点。

的一个特殊之处在于,如果没有有效的全局语句,则对名称的赋值总是进入最内部的作用域。

票数 2
EN

Stack Overflow用户

发布于 2010-08-20 04:39:52

问题是更新的问题。

无法更新a,因为它不是函数的本地命名空间中的变量。就地更新分配操作无法就地更新a

有趣的是,a = a + 1也失败了。

Python为这类语句生成略微优化的代码。它使用"LOAD_FAST“指令。

代码语言:javascript
复制
  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“。

代码语言:javascript
复制
  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        
票数 1
EN

Stack Overflow用户

发布于 2010-08-20 04:41:25

a += 1等同于a = a + 1。通过将其赋值给变量a,可以将其设为局部变量。您尝试分配a + 1的值失败,因为a尚未绑定。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3525985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档