【发布时间】:2017-09-04 19:56:31
【问题描述】:
我正在阅读 Python 代码的 sn-p,但有一件事我无法理解。 a 是一个列表,num 是一个整数
a += num,
有效但
a += num
行不通。谁能给我解释一下?
【问题讨论】:
我正在阅读 Python 代码的 sn-p,但有一件事我无法理解。 a 是一个列表,num 是一个整数
a += num,
有效但
a += num
行不通。谁能给我解释一下?
【问题讨论】:
首先,重要的是要注意a += 1, 在这种情况下与a = a + 1, 的工作方式不同。 (a = a + 1, 和 a = a + (1,) 都抛出了 TypeError,因为你不能连接一个列表和一个元组,但是你可以扩展一个带有元组的列表。)
+= 调用列表__iadd__ 方法,该方法调用list.extend 然后返回原始列表本身。
1, 是一个长度为 1 的元组,所以你正在做的是
>>> a = []
>>> a.extend((1,))
>>> a
[1]
由于长度为一个元组,这看起来很奇怪。但它的工作原理就像用任意长度的元组扩展一个列表:
>>> a.extend((2,3,4))
>>> a
[1, 2, 3, 4]
【讨论】:
结尾的逗号使赋值的右侧变成一个元组,而不是一个整数。元组是类似于列表的容器结构(有一些区别)。例如,这两个是等价的:
a += num,
a += (num, )
Python 允许您将元组添加到列表中,并将元组的每个元素附加到列表中。它不允许您将单个整数添加到列表中,您必须为此使用 append 。
【讨论】:
使用
num,
声明一个长度为 1 的元组,而不是整数。
因此,如果 a = [0,1] 且 num = 2
a+=num,
等价于
a.extend((num,))
或
a.extend((2,))=[0,1,2]
同时
a+=num
等价于
a.extend(num)
或
a.extend(2)
这会产生错误,因为您可以将元组附加到数组,但不能附加整数。因此第一个公式有效,而第二个给你一个错误
【讨论】:
a+=num,不等同于a=a+(num,),第二个抛出TypeError。第一个没有,因为内部+= 使用list.extend。
extend返回None,所以你的分配分配给None。