Python 列表上的 append() 与 += 运算符,为什么它们会产生不同的结果?[重复]
- 2025-01-14 08:50:00
- admin 原创
- 104
问题描述:
为什么这两个操作会产生不同的结果?
>>> 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:
编者注:此答案混淆了列表、数组以及。尽管如此,这些概念足够相似,仍然有用。+=
`+`
解释“为什么”:
该+
操作将数组元素添加到原始数组中。该array.append
操作将数组(或任何对象)插入到原始数组的末尾,从而导致在该位置产生对 self 的引用(因此,对于列表,会出现无限递归,但对于数组,您会收到类型错误)。
此处的区别在于,当您通过连接元素+
添加数组(它像其他数组一样被重载,请参阅本章append
序列)时,操作会采取特定行为。但是 -method 会按您的要求执行:将对象附加到您提供的右侧(数组或任何其他对象),而不是获取其元素。
另一种选择
extend()
如果您想使用与运算符类似的函数,请使用+
(其他人也在此处展示了这一点)。相反的做法是不明智的:尝试append
使用+
列表的运算符进行模仿(请参阅我之前的链接了解原因)。有关列表的更多信息如下:
列表
[编辑] 一些评论者认为问题是关于列表而不是数组。问题已经改变,但我应该早点把这个问题包括进去。
上面关于 s 的大部分内容array
也适用于列表:
该
+
运算符将两个列表连接在一起。该运算符将返回一个新的列表对象。List.append
不会将一个列表附加到另一个列表,而是将单个对象(此处为list
)附加到当前列表的末尾。c
因此,将其添加到自身会导致无限递归。与数组一样,您可以使用
List.extend
将列表添加到另一个列表(或iterable
)。这将更改您当前的列表,而不是+
返回新列表。
解决方案 2:
连接运算符+
是一个二进制中缀运算符,当应用于列表时,它会返回一个新列表,其中包含其两个操作数的所有元素。该list.append()
方法是一个变量器,它将list
其单个对象参数(在您的特定示例中为列表c
)附加到主题list
。在您的示例中,这会导致c
附加对自身的引用(因此是无限递归)。
'+' 连接的替代方法
该list.extend()
方法也是一个 mutator 方法,它将 iterable 参数与 subject 连接起来list
。具体来说,它按迭代顺序附加 iterable 的每个元素。
题外话
作为运算符,+
将表达式的结果作为新值返回。作为非链式赋值方法,list.extend()
就地修改主题列表并且不返回任何内容。
数组
我添加这一点是因为Abel 的上述回答可能会因混合列表、序列和数组的讨论而造成混淆。
数组是在序列和列表之后添加到 Python 中的,作为存储整数数据类型数组的更高效的方式。不要将array
s 与list
s 混淆。它们并不相同。
来自数组文档:
数组是序列类型,其行为与列表非常相似,只是数组中存储的对象类型受到限制。数组的类型是在创建对象时使用类型代码(单个字符)指定的。
解决方案 3:
append
正在将元素附加到列表。如果您想使用新列表扩展列表,则需要使用extend
。
>>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]
解决方案 4:
Python 列表是异构的,即同一列表中的元素可以是任何类型的对象。表达式:c.append(c)
将对象c
(无论它是什么)附加到列表中。在这种情况下,它使列表本身成为列表的成员。
表达式c += c
将两个列表相加,并将结果赋给变量c
。重载+
运算符定义在列表上,用于创建一个新列表,其内容是第一个列表中的元素和第二个列表中的元素。
因此,这些实际上只是设计用来做不同事情的不同表达方式。
解决方案 5:
您正在寻找的方法是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).
解决方案 6:
你应该使用 extend()
>>> c=[1,2,3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]
其他信息:附加与扩展
解决方案 7:
参见文档:
列表.附加(x)
将一个项目添加到列表末尾;相当于 a[len(a):] = [x]。
list.extend(L) - 通过附加给定列表中的所有项目来扩展列表;相当于 a[len(a):] = L。
c.append(c)
将 c作为元素“附加”到自身。由于列表是引用类型,因此这会创建一个递归数据结构。
c += c
等同于extend(c)
,将c 的元素附加到 c 。