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)。的值ab被正确地打印。这让我感到困惑,原因有两个:

  1. 为什么在行(A)处抛出运行时错误,因为后面的行(B)语句?

  2. 为什么变量ab打印符合预期,同时c引发错误?

我能想到的唯一解释是,赋值创建了一个局部变量,即使在创建局部变量之前,它也优先于“全局”变量。当然,变量在存在之前“窃取”范围是没有意义的。cc+=1c

有人可以解释一下这种行为吗?


守着星空守着你
浏览 801回答 3
3回答

jeck猫

看一下反汇编可能会澄清发生了什么:>>> 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中并打印它”,当它检测到该变量仍然未初始化时,引发异常。
打开App,查看更多内容
随时随地看视频慕课网APP