为什么这两项操作(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
是相同的。为什么它与+
操作不同?
答案 0 :(得分:125)
+
operation将array元素添加到原始数组中。 array.append
操作将数组(或任何对象)插入到原始数组的末尾,这导致该点中的引用自(因此无限递归)。
这里的区别在于,当你添加一个数组时,+操作是特定的(它像其他一样重载,在序列上看this chapter)通过连接元素。然而,append-method确实按照你的要求进行:将对象附加到你给它的右侧(数组或任何其他对象),而不是取其元素。
如果要使用与+运算符类似的函数,请使用extend()
(正如其他人在此处所示)。做相反的事情是不明智的:尝试使用列表的+运算符来模仿追加(请参阅我的earlier link了解原因)。
为了好玩,有点历史:1993年2月的birth of the array module in Python。它可能让你感到惊讶,但是在序列和列表出现之后,数组被添加了。
答案 1 :(得分:15)
append
将一个元素附加到列表中。如果您想使用新列表扩展列表,则需要使用extend
。
>>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]
答案 2 :(得分:14)
连接运算符+
是一个二进制中缀运算符,当应用于列表时,返回一个包含其两个操作数中每个元素的所有元素的新列表。 list.append()
方法是list
上的mutator
,会将其单个object
参数(在您的具体示例中为列表c
)附加到主题list
}。在您的示例中,这会导致c
附加对自身的引用(因此无限递归)。
list.extend()
方法也是一种mutator方法,它将sequence
参数与主题list
连接起来。具体来说,它以迭代顺序附加sequence
的每个元素。
作为运算符,+
将表达式的结果作为新值返回。作为非链式mutator
方法,list.extend()
就地修改主题列表并且不返回任何内容。
我已经添加了这个,因为上面的Abel的回答可能会混淆列表,序列和数组的讨论。
在序列和列表之后,Arrays
被添加到Python中,作为存储整数数据类型数组的更有效方法。不要将arrays
与lists
混淆。他们不一样。
来自array docs:
数组是序列类型,其行为与列表非常相似,只是存储在其中的对象类型受到约束。在对象创建时使用类型代码指定类型,类型代码是单个字符。
答案 3 :(得分:8)
Python列表是异构的,即同一列表中的元素可以是任何类型的对象。表达式:c.append(c)
将对象c
附加到列表中。在这种情况下,它使列表本身成为列表的成员。
表达式c += c
将两个列表一起添加,并将结果分配给变量c
。在列表上定义了重载的+
运算符,以创建一个新列表,其内容是第一个列表中的元素和第二个列表中的元素。
所以这些只是用来通过设计做不同事情的不同表达方式。
答案 4 :(得分:6)
您正在寻找的方法是extend()
。来自Python documentation:
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).
答案 5 :(得分:2)
答案 6 :(得分:2)
list.append(x)的
- 将项目添加到列表的末尾;相当于[len(a):] = [x]。
list.extend(L) - 通过附加给定列表中的所有项目来扩展列表; 相当于[len(a):] = L。
c.append(c)
“将”c附加到自身作为元素。由于列表是引用类型,因此会创建递归数据结构。
c += c
相当于extend(c)
,它将 c 的元素追加到c。