为什么这两个操作(append()
分别+
)给出不同的结果?
>>> c = [1, 2, 3]
>>> c
[1, 2, 3]
>>> c += c
>>> c
[1, 2, 3, 1, 2, 3]
>>> c = [1, 2, 3]
>>> c.append(c)
>>> c
[1, 2, 3, [...]]
>>>
在最后一种情况下,实际上存在无限递归。c[-1]
和c
一样。为什么与+
操作不同?
为什么这两个操作(append()
分别+
)给出不同的结果?
>>> c = [1, 2, 3]
>>> c
[1, 2, 3]
>>> c += c
>>> c
[1, 2, 3, 1, 2, 3]
>>> c = [1, 2, 3]
>>> c.append(c)
>>> c
[1, 2, 3, [...]]
>>>
在最后一种情况下,实际上存在无限递归。c[-1]
和c
一样。为什么与+
操作不同?
Answers:
该+
操作将数组元素添加到原始数组。该array.append
操作将数组(或任何对象)插入到原始数组的末尾,从而导致对该点的self引用(因此无限递归)。
此处的区别在于,通过连接元素添加数组时,+操作是特定的(它像其他数组一样重载,请参见本章中的序列)。但是,append-method确实可以按照您的要求执行:将对象附加在您赋予它的右侧(数组或任何其他对象),而不是获取其元素。
使用extend()
,如果你想使用的作用类似于+运算符的功能(如其他人在这里显示为好)。相反,这样做是不明智的:尝试使用+运算符模仿列表的追加(有关原因,请参阅我之前的链接)。
有趣的是,有一段历史:1993年2月Python中的数组模块的诞生。这也许会让您感到惊讶,但是在序列和列表出现之后才添加了数组。
+
是对称的:将列表与列表连接起来。
串联运算符+
是一个二进制中缀运算符,当应用于列表时,它返回一个包含其两个操作数每个元素的所有元素的新列表。该list.append()
方法是mutator
on list
,将其单个object
参数(在您的特定示例中为列表c
)附加到主题list
。在您的示例中,这导致c
对其自身附加引用(因此可以进行无限递归)。
该list.extend()
方法还是mutator方法,将其sequence
参数与主题连接在一起list
。具体来说,它sequence
按迭代顺序附加的每个元素。
作为运算符,+
将表达式的结果作为新值返回。作为一种非链接mutator
方法,list.extend()
可就地修改主题列表,但不返回任何内容。
我之所以添加此内容,是因为上述Abel的答案可能会由于混合列表,序列和数组的讨论而引起潜在的混乱。
Arrays
是在序列和列表之后添加到Python的,这是一种更有效的方式来存储整数数据类型的数组。不要arrays
与混淆lists
。她们不一样。
从数组文档:
数组是序列类型,其行为与列表非常相似,不同之处在于数组中存储的对象类型受到约束。类型是在对象创建时通过使用类型代码(一个字符)指定的。
append
将元素添加到列表。如果要使用新列表扩展列表,则需要使用extend
。
>>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]
+
并extend
产生不同的结果,我们需要考虑一下。
append
并且+
有所不同。这就是为什么。我喜欢这个答案,因为提供这样做的意义更大。
__lt__
不能在Python中重载(如今可以)。为什么问题是最基本的问题,但通常是最棘手的问题:为什么要本质,而不是手册的指针。当然:如果您不喜欢某个问题(我最不喜欢),请不要回答;-)
c += [c]
和c.append(c[:])
太。
a+b != a*b
?它们是不同的操作。那就是答案。“为什么”没有其他问题有用,例如“如何正确附加?” 还是“导致无限递归的这个附件有什么问题?” “我对X做什么”或“我X出错了”形式的问题?或者“我应该怎么做而不是X”也可以帮助某人学习,但可以提供重点突出,可用且可行的答案。
您正在寻找的方法是extend()
。从Python 文档中:
list.append(x)
Add an item to the end of the list; equivalent to a[len(a):] = [x].
list.extend(L)
Extend the list by appending all the items in the given list; equivalent to a[len(a):] = L.
list.insert(i, x)
Insert an item at a given position. The first argument is the index of the element before which to insert, so a.insert(0, x) inserts at the front of the list, and a.insert(len(a), x) is equivalent to a.append(x).