【问题标题】:UnboundLocalError while using += but not append list [duplicate]使用 += 但未附加列表时出现 UnboundLocalError [重复]
【发布时间】:2016-03-12 21:25:48
【问题描述】:

我不太明白下面两个类似代码的区别:

def y(x):
    temp=[]
    def z(j):
        temp.append(j)
    z(1)
    return temp

调用y(2) 返回[1]

def y(x):
    temp=[]
    def z(j):
        temp+=[j]
    z(1)
    return temp

调用y(2) 返回UnboundLocalError: local variable 'temp' referenced before assignment。为什么+ 运算符会生成错误?谢谢

【问题讨论】:

    标签: python list append


    【解决方案1】:

    标题的答案,+和“追加”的区别是:

    [11, 22] + [33, 44,] 
    

    会给你:

    [11, 22, 33, 44]
    

    和。

    b = [11, 22, 33]
    b.append([44, 55, 66]) 
    

    会给你

    [11, 22, 33 [44, 55, 66]] 
    

    错误答案

    这是因为当您对作用域中的变量进行赋值时,该变量成为该作用域的本地变量,并隐藏外部作用域中任何类似命名的变量

    这里的问题是temp+=[j] 等于temp = temp +[j]。临时变量在分配之前在此处读取。这就是它给出这个问题的原因。这实际上包含在 python 常见问题解答中。

    如需进一步阅读,请点击here。 :)

    【讨论】:

    • 您的第一部分显示+= 更像extend 而不是append。但是+= 并不完全像temp=temp+[]。在一个id 更改,在另一个它没有。 iadd 文档声称 x.__iadd__(y) <==> x+=y。但显然,范围规则首先适用。所以这种等价也不准确。
    【解决方案2】:

    UnboundLocalError 的出现是因为,当您对作用域中的变量进行赋值时,Python 会自动将该变量视为 该作用域的本地变量,并隐藏任何类似命名的变量外部范围。

    append 函数中,本身没有进行赋值,因此没有范围错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 2020-03-02
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      相关资源
      最近更新 更多