137

为什么这两个操作(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是相同的。为什么和+操作不一样?

4

7 回答 7

169

解释“为什么”:

+操作数组元素添加到原始数组。该array.append操作将数组(或任何对象)插入到原始数组的末尾,这会导致在该位置对 self 的引用(因此是无限递归)。

这里的不同之处在于,当您通过连接元素来添加数组(它像其他数组一样重载,请参阅关于序列的本章)时,+ 操作的作用是特定的。然而,附加方法确实按照您的要求执行:将对象附加到您给它的右侧(数组或任何其他对象),而不是获取它的元素。

替代

如果您想使用extend()类似于 + 运算符的函数(正如其他人在此处显示的那样),请使用。做相反的事情是不明智的:尝试用 + 运算符模拟列表的追加(请参阅我之前的链接了解原因)。

小历史

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

于 2010-01-07T16:58:39.643 回答
29

连接运算符+是一个二元中缀运算符,当应用于列表时,它返回一个新列表,其中包含其两个操作数中每个操作数的所有元素。该list.append()方法是将其单个参数(在您的特定示例中为 list )附加mutator到subject的方法。在您的示例中,这会导致附加对自身的引用(因此是无限递归)。listobjectclistc

'+' 连接的替代方案

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

旁白

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

数组

由于上述 Abel 的回答可能通过混合对列表、序列和数组的讨论而引起的潜在混淆,我添加了这一点。 Arrays在序列和列表之后被添加到 Python 中,作为存储整数数据类型数组的更有效方式。不要arrayslists. 它们是不相同的。

数组文档

Arrays are sequence types and behave very much like lists, except that the type of objects stored in them is constrained. The type is specified at object creation time by using a type code, which is a single character.

于 2013-07-03T03:35:40.893 回答
21

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

>>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]
于 2010-01-07T16:59:50.737 回答
9

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

该表达式c += c将两个列表相加并将结果分配给变量c。在列表上定义重载+运算符以创建一个新列表,其内容是第一个列表中的元素和第二个列表中的元素。

所以这些实际上只是设计用来做不同事情的不同表达方式。

于 2010-01-07T17:00:49.263 回答
7

您正在寻找的方法是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).
于 2010-01-07T17:03:59.993 回答
3

你应该使用 extend()

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

其他信息:追加与扩展

于 2010-01-07T17:02:07.423 回答
2

请参阅文档

list.append(x)

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

list.extend(L) - 通过附加给定列表中的所有项目来扩展列表;等价于 a[len(a):] = L。

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

c += c等价于extend(c),它将c 的元素附加到 c.

于 2010-01-07T17:10:03.067 回答