首页 > 解决方案 > 列表的范围规则:赋值语句和 UnboundedLocalErrors

问题描述

这是变量范围的后续问题,不可变与可变,就 += 而言

def update():
    L.extend([1])
L=[1,2,3]
update()
print(L)

输出[1,2,3,1]

def update1():
    L=L+[1]
L=[1,2,3]
update1()
print(L)

输出UnboundLocalError: local variable 'L' referenced before assignment

def update2():
    L[0]=L[0]+1
L=[1,2,3]
update2()
print(L)

输出[2,2,3]

我知道这update1()会产生 UnboundLocalError ,因为当在内部对 L 进行赋值时update1(),python将 L 标记为没有赋值的局部变量。所以L+=[1]给出一个错误,因为在分配之前正在读取一个变量。(这也是“你不能修改在当前范围之外定义的变量”的原因)

我知道这是update()可行的,因为没有对 L 进行赋值,所以 python 没有创建局部变量 L(没有赋值)。因此,根据 LEGB 规则,然后将 extend 方法应用于全局变量 L。

但我不明白为什么update2()有效。我在想可能会发生以下一件或所有事情

  1. python 可能会给出语法错误,或者可能是类型error() (因为L[0]不是有效的变量名)
  2. 如果 L 被标记为没有赋值的局部变量,python 会给出类型错误。
  3. UnboundedLocalError

但以上都不是

是否应该将它 ( update2()) 视为一个例外,或者是否有解释为什么update(2)会以这种方式工作?

标签: python

解决方案


推荐阅读