Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python append()与&x2B;列表上的运算符,为什么会给出不同的结果?_Python_List_Append_Nested Lists - Fatal编程技术网

Python append()与&x2B;列表上的运算符,为什么会给出不同的结果?

Python append()与&x2B;列表上的运算符,为什么会给出不同的结果?,python,list,append,nested-lists,Python,List,Append,Nested Lists,为什么这两个操作(append()resp.+)会给出不同的结果 >>> 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, [...]] >>> 在最后一种情况下,实际上

为什么这两个操作(
append()
resp.
+
)会给出不同的结果

>>> 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
是相同的。为什么与
+
操作不同?

解释“为什么”: 将元素添加到原始数组中。该操作将数组(或任何对象)插入原始数组的末尾,从而在该点中引用self(因此是无限递归)

这里的区别在于,当通过连接元素添加数组时,+操作的行为是特定的(它与其他数组一样重载,请参见序列)。然而,append方法确实满足了您的要求:将对象附加到您给它的右侧(数组或任何其他对象),而不是获取其元素

替代方案 如果要使用与+运算符类似的函数,请使用(其他函数也在此处显示)。做相反的事情是不明智的:尝试用+操作符模拟列表的append(参见我的“为什么”)

小历史
为了好玩,《一点历史:1993年2月的电影》。这可能会让您感到惊讶,但数组是在序列和列表出现之后添加的。

append
是在列表中添加元素。如果要使用新列表扩展列表,则需要使用
extend

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

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

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

因此,这些实际上只是设计时用来做不同事情的不同表达式。

您应该使用extend()


其他信息:

您正在寻找的方法是
extend()
。从Python中:

见:

list.append(x)

  • 在列表末尾添加一个项目;相当于a[len(a):]=[x]
列表。扩展(L) -通过追加给定列表中的所有项目来扩展列表; 相当于a[len(a):]=L

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


c+=c
相当于
extend(c)
,它将c的元素附加到c。

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

“+”串联的替代方法 该方法也是一种mutator方法,它将其
序列
参数与主题连接起来。具体地说,它按照迭代顺序附加
序列的每个元素

旁白 作为运算符,将表达式的结果作为新值返回。作为非链式
mutator
方法,修改主题列表,不返回任何内容

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

从:


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

+1因为我总是上传准确的信息。链接到官方文件总是一个加号!“为什么”的另一部分:理智的人们期望代码“++/CODE”是对称的:将列表与列表连接起来。+ 1,好点Beni(虽然我可以认为它是“理智的”来表示“RH边上的对象被附加到LH侧上的数组”,但是个人发现当前的行为更明智)。如果一个元素是单个字符串,例如s=“Word”,L =['this','is'].那么l.append(s)和l+s应该是一样的。我说的对吗?我想很清楚为什么结果不同,因为操作不一样!如果出现
+
extend
产生不同的结果,我们会有一些想法。+1:为什么我不喜欢“为什么”问题:
append
+
是不同的。这就是为什么。我喜欢这个答案,因为它提供了更有意义的方法。这个网站不是关于回答问题的吗?人们问为什么PHP被称为PHP,为什么Python中的
\ult\uucode>不能重载(现在可以)。为什么问题是最基本的,但往往是最难回答的:它们要求的是本质,而不是指向手册的指针。当然:如果你不喜欢某个问题(我最不喜欢),那么就不要回答;-)为了进一步演示,可以显示
c+=[c]
c.append(c[:])
也是。@Abel:a+b!=a*b为什么是a+b?
?它们是不同的操作。这就是答案。“为什么”没有其他问题那么有用,比如“我如何正确地追加?”或“这个追加导致无限递归有什么问题?”形式的问题“我对X做了什么”或“我做X时出错了什么”?或“我应该做什么来代替X”威尔
>>> c=[1,2,3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]
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).