为了账号安全,请及时绑定邮箱和手机立即绑定

Python变量范围错误

Python变量范围错误

Python变量范围错误以下代码在Python 2.5和3.0中按预期工作:a, b, c = (1, 2, 3)print(a, b, c)def test():     print(a)     print(b)     print(c)    # (A)     #c+=1       # (B)test()但是,当我取消注释行(B)时,我得到了UnboundLocalError: 'c' not assigned一行(A)。的值a和b被正确地打印。这让我感到困惑,原因有两个:为什么在行(A)处抛出运行时错误,因为后面的行(B)语句?为什么变量a和b打印符合预期,同时c引发错误?我能想到的唯一解释是,赋值创建了一个局部变量,即使在创建局部变量之前,它也优先于“全局”变量。当然,变量在存在之前“窃取”范围是没有意义的。cc+=1c有人可以解释一下这种行为吗?
查看完整描述

3 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

看一下反汇编可能会澄清发生了什么:


>>> def f():

...    print a

...    print b

...    a = 1


>>> import dis

>>> dis.dis(f)


  2           0 LOAD_FAST                0 (a)

              3 PRINT_ITEM

              4 PRINT_NEWLINE


  3           5 LOAD_GLOBAL              0 (b)

              8 PRINT_ITEM

              9 PRINT_NEWLINE


  4          10 LOAD_CONST               1 (1)

             13 STORE_FAST               0 (a)

             16 LOAD_CONST               0 (None)

             19 RETURN_VALUE

如您所见,用于访问a的字节码是LOAD_FAST和b LOAD_GLOBAL。这是因为编译器已经识别出在函数内分配了a,并将其归类为局部变量。本地化的访问机制对于全局变量是根本不同的 - 它们在帧的变量表中静态分配了一个偏移量,这意味着查找是一个快速索引,而不是像全局变量那样更昂贵的dict查找。正因为如此,Python正在读取该print a行“获取局部变量的值'a'保存在插槽0中并打印它”,当它检测到该变量仍然未初始化时,引发异常。


查看完整回答
反对 回复 2019-05-27
  • 3 回答
  • 0 关注
  • 753 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信