Python append() 与列表中的 + 运算符,为什么它们会给出不同的结果?[复制]

Python append() vs. + operator on lists, why do these give different results? [duplicate]

提问人:ooboo 提问时间:1/8/2010 最后编辑:Micha Wiedenmannooboo 更新时间:9/1/2022 访问量:172009

问:

为什么这两个操作(或)给出不同的结果?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+

列表 附加 嵌套列表

评论

1赞 Abel 1/8/2010
恕我直言,这是一个可行的新问题:我回滚到原始问题以保持干净(每个线程 1 个问题,请参阅 SO FAQ)。请提出一个新问题或在每个答案下方的评论线程中提出后续问题。注意:您的编辑不会丢失,单击历史记录,您可以将其复制/粘贴到新问题中。

答:

179赞 Abel 1/8/2010 #1

解释“为什么”:

+ 操作数组元素添加到原始数组中。array.append 操作将数组(或任何对象)插入到原始数组的末尾,这会导致在该位置引用 self(因此,在列表的情况下是无限递归,但对于数组,您会收到类型错误)。

这里的区别在于,当您通过连接元素添加数组时,该操作会特定地执行(它像其他数组一样重载,请参阅有关序列的本章)。然而,-method 从字面上做到了你的要求:将对象附加到你给它的右侧(数组或任何其他对象),而不是获取它的元素。+append

另一种选择

如果你想使用一个与运算符类似的函数,请使用 extend(),正如其他人在这里展示的那样。反其道而行之是不明智的:尝试模仿列表的运算符(请参阅我之前的链接了解原因)。更多列表如下:+append+

列表

[编辑]一些评论者认为,这个问题是关于列表的,而不是关于数组的。问题已经改变,尽管我应该早点包括这一点。

以上关于 s 的大多数内容也适用于列表:array

  • 运算符将两个列表连接在一起。运算符将返回一个新的列表对象。+
  • List.append不会将一个列表与另一个列表一起附加,而是在当前列表的末尾附加一个对象(此处为 )。因此,向自身添加会导致无限递归。listc
  • 与数组一样,您可以使用 List.extend 添加带有另一个列表(或 )的扩展列表。这将原地更改当前列表,而不是返回新列表。iterable+

历史不长

为了好玩,我们来了解一下历史:1993 年 2 月,Python 中的数组模块诞生了。这可能会让你感到惊讶,但数组是在序列和列表出现之后添加的。

22赞 SilentGhost 1/8/2010 #2

append将元素追加到列表中。如果要使用新列表扩展列表,则需要使用 .extend

>>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]
9赞 Tendayi Mawushe 1/8/2010 #3

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

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

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

3赞 ghostdog74 1/8/2010 #4

你应该使用 extend()

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

其他信息: Append vs. Extend

7赞 Chinmay Kanchi 1/8/2010 #5

您要查找的方法是 .来自 Python 文档extend()

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).
2赞 oefe 1/8/2010 #6

请参阅文档

列表.append(x)

  • 将项目添加到列表末尾;等价于 a[len(a):] = [x]。

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

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

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

33赞 Dave 7/3/2013 #7

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

“+”串联的替代方法

list.extend() 方法也是一个 mutator 方法,它将其参数与主题列表连接起来。具体来说,它按迭代顺序追加每个元素。sequencesequence

旁白

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

阵 列

我之所以添加这个,是因为上面的 Abel 的回答可能会因为混合对列表、序列和数组的讨论而引起潜在的混淆。被添加到序列和列表之后的 Python 中,作为存储整数数据类型数组的更有效方法。不要与 混淆。它们是不一样的。arrayslists

阵列文档中:

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