使用 += 但未附加列表时出现 UnboundLocalError [重复]

Posted

技术标签:

【中文标题】使用 += 但未附加列表时出现 UnboundLocalError [重复]【英文标题】:UnboundLocalError while using += but not append list [duplicate] 【发布时间】: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。为什么+ 运算符会生成错误?谢谢

【问题讨论】:

【参考方案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 函数中,本身没有进行赋值,因此没有范围错误。

【讨论】:

以上是关于使用 += 但未附加列表时出现 UnboundLocalError [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 microsoft graph api c# 创建在线会议时出现 404 错误,但未登录 AzureActiveDirectory

尝试在 ANDROID 资源中使用 <!ENTITY 时出现错误:“实体已被引用,但未声明。”

使用 Xcode 6.3.1 生成 IPA 时出现问题

htaccess:尝试 ErrorDocument 时出现 404 Not Found 错误

使用了 Libtool 库,但未定义“LIBTOOL”?

出现 CSS 类但未应用样式 -REACTSTRAP - CSS MODULES