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

oob*_*boo 100 python list append nested-lists

为什么这两个操作(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, [...]]
>>> 
Run Code Online (Sandbox Code Playgroud)

在最后一种情况下,实际上存在无限递归.c[-1]并且c是一样的.为什么它与+操作不同?

Abe*_*bel 130

解释"为什么":

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

这里的区别在于,当你添加一个数组时,+操作是特定的(它像其他一样重载,参见序列的这一章),通过连接元素.然而,append-method确实按字面意思执行:将对象附加到您给它的右侧(数组或任何其他对象),而不是取其元素.

替代

使用extend(),如果你想使用的作用类似于+运算符的功能(如其他人在这里显示为好).做相反的做法并不明智:尝试使用+运算符模拟附加列表(请参阅我之前关于原因的链接).

历史不多

为了好玩,有点历史:1993年2月在Python诞生了数组模块.它可能让你大吃一惊,但是在序列和列表出现之后,数组被添加了.

  • "为什么"的另一部分:理智的人希望`+`是对称的:连接列表与列表. (9认同)
  • +1因为我总是提供准确的信息.官方文档的链接总是一个加号! (2认同)

Dav*_*ave 18

连接运算符+是二进制中缀运算符,当应用于列表时,返回包含其两个操作数中每个操作数的所有元素的新列表.该list.append()方法是mutatorlist其中追加其单object参数(在你的具体例子清单c)给患者list.在您的示例中,这会导致c对自身附加引用(因此无限递归).

'+'连接的替代方案

list.extend()方法也是一种将其sequence论证与主题联系起来的mutator方法list.具体来说,它sequence以迭代顺序附加每个元素.

一边说

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

数组

我添加了这个,因为上面的Abel的答案可能会混淆列表,序列和数组的讨论. Arrays在序列和列表之后添加到Python中,作为存储整数数据类型数组的更有效方法.不要混淆arrayslists.他们不一样.

数组文档:

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


Sil*_*ost 15

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

>>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

  • 我认为很清楚*为什么*结果不同,因为操作不一样!如果看起来"+"和"extend"会产生不同的结果,我们就会有一些想法. (4认同)
  • @Abel:为什么'a + b!= a*b`?他们是不同的行动.这就是答案."为什么"没有其他问题那么有用,比如"我怎样才能正确追加?" 或者"这个附加有什么问题会导致无限递归?" "我怎么做X"或"我做X时出了什么问题"这一形式的问题?或者"我应该做什么而不是X"也可以帮助别人学习,但会提供有针对性,可用,可操作的答案. (2认同)

Ten*_*she 8

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

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

所以这些只是用于设计不同事物的不同表达方式.


Chi*_*chi 6

你正在寻找的方法是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).
Run Code Online (Sandbox Code Playgroud)

  • 好的ol'文档+1.人们应该多读一读. (3认同)