Python追加()与列表中的+运算符,为什么这些给出不同的结果?

为什么这两个操作( append() resp。 + )给出不同的结果?

 >>> 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, [...]] >>> 

在最后一种情况下,实际上有一个无限recursion。 c[-1]c是一样的。 为什么和+操作有所不同?

解释“为什么”:

+操作将数组元素添加到原始数组中。 array.append操作将数组(或任何对象)插入到原始数组的末尾,从而导致对该位置的自引用 (因此为无限recursion)。

这里的区别在于+操作通过连接元素来添加一个数组(像其他数据一样被重载,参见本章的序列)。 然而append-method的确按照你所要求的方式:在你给它的右边追加对象(数组或其他对象),而不是取其元素。

替代

如果你想使用一个类似于+运算符的函数,就使用extend() (正如其他人已经在这里展示的那样)。 做相反的事情是不明智的:尝试模仿用+运算符来追加列表(请参阅我之前关于为什么的链接 )。

历史不长

有趣的是,有一点历史:1993年2月Python中的数组模块的诞生 。它可能会让你感到惊讶,但数组是在序列和列表出现之后添加的。

append是将元素附加到列表中。 如果你想用新的列表扩展列表,你需要使用extend

 >>> c = [1, 2, 3] >>> c.extend(c) >>> c [1, 2, 3, 1, 2, 3] 

连接运算符+是一个二进制中缀运算符,应用于列表时,将返回一个包含其两个操作数中每一个的所有元素的新列表。 list.append()方法是list上的一个mutator ,它将其单个object参数(在您的具体示例中是列表c )追加到主题list 。 在你的例子中,这会导致c附加一个对自身的引用(因此是无限recursion)。

“+”串联的替代scheme

list.extend()方法也是一个将它的sequence参数和主题list连接起来的mutator方法。 具体来说,它以迭代顺序附加每个sequence元素。

一边

作为运算符, +将expression式的结果作为新值返回。 作为一个非链式mutator方法, list.extend()修改了主题列表,并不返回任何内容。

数组

由于混淆了列表,序列和数组的讨论,Abel上面的答案可能导致混淆,所以我添加了这个。 在序列和列表之后, Arrays被添加到Python中,作为存储整数数据types数组的更有效的方式。 不要将arrayslists混淆。 他们不一样。

从arrays文档 :

数组是序列types,其行为与列表非常类似,除了存储在其中的对象的types受到约束。 types是在对象创build时使用types代码(在单个字符中)指定的。

Python列表是异构的,即同一列表中的元素可以是任何types的对象。 expression式: c.append(c)将对象c追加到列表中。 在这种情况下,它使列表本身成为列表中的一员。

expression式c += c将两个列表相加,并将结果赋给variablesc 。 在列表上定义了重载的+运算符,以创build一个新的列表,其内容是第一个列表中的元素和第二个列表中的元素。

所以这些实际上只是用于通过devise做不同的事情的不同的expression。

你正在寻找的方法是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). 

你应该使用extend()

 >>> c=[1,2,3] >>> c.extend(c) >>> c [1, 2, 3, 1, 2, 3] 

其他信息: 追加与扩展

请参阅文档 :

list.append(x)的

  • 将项目添加到列表的末尾; 相当于一个[len(a):] = [x]。

list.extend(L) – 通过附加给定列表中的所有项目来扩展列表; 相当于一个[len(a):] = L.

c.append(c)将“c”附加到自身中作为一个元素 。 由于列表是引用types,因此会创buildrecursion数据结构。

c += c相当于extend(c) ,它将c的元素附加到c。