Python append() vs. + operator on lists, why do these give different results? Python中的append()和+操作符在列表上的使用为什么会产生不同的结果?

8 浏览
0 Comments

Python append() vs. + operator on lists, why do these give different results? Python中的append()和+操作符在列表上的使用为什么会产生不同的结果?

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

0
0 Comments

Python的append方法是将一个元素添加到列表中。如果想要用新列表扩展原列表,需要使用extend方法。

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

这样的结果是[1, 2, 3, 1, 2, 3]。

为什么append+操作符得到的结果不同,我认为很明显,因为这两个操作是不同的!如果+extend得到的结果是一样的,那我们就有些需要思考的问题了。

回答1:为什么我不喜欢“为什么”的问题:因为append+是不同的。这就是为什么。我喜欢这个回答,因为它提供了更合理的方法。

这个网站难道不是用来回答提出的问题吗?人们问为什么PHP叫PHP,为什么在Python中不能重载__lt__(现在是可以的)。为什么的问题是最基本的问题,但通常也是最棘手的问题:它们询问的是本质,而不是手册上的指针。当然,如果你不喜欢一个问题(我不喜欢大部分问题),那就不要回答它。

为了进一步证明,也许可以展示c += [c]c.append(c[:])的结果。

回答2:为什么a+b != a*b?因为它们是不同的操作。这就是答案。“为什么”没有其他问题的帮助那么大,比如“我如何正确地添加元素?”或者“这个append有什么问题,导致无限递归?”“我该怎么做才能达到X”的形式的问题也会帮助某人学习,而且会得到有针对性、可用、可行的答案。

有趣的副讨论,不确定我们是否应该...但是...:如果你问“我该如何做X”,你回答obj.X或者obj+X。更详细的回答者还会解释为什么你应该选择其中之一,教会提问者如何思考。是的,我同意,“什么”,“如何”等可以给出非常简单、非常清晰的答案,大部分时间都是这样。为什么往往被称为唯一具有无限答案的问题。但它教会我们思考。 “我们如何生活是无聊的”(在我看来),“我们为什么而生活”更加有趣。Python的起源问题是“为什么我们需要一种新的语言”。答案就是这种语言。

0
0 Comments

Python中,列表的拼接操作符+是一个二元中缀运算符,当应用于列表时,返回一个包含其两个操作数的所有元素的新列表。列表的append()方法是一个对列表进行修改的方法,它将其单个对象参数(在这个例子中是列表c)附加到主列表中。在这个例子中,这导致c附加一个对自身的引用(因此产生了无限递归)。

一个替代的拼接方法是列表的extend()方法。它也是一个修改器方法,用于将其序列参数与主列表连接。具体而言,它按迭代顺序附加序列的每个元素。

值得一提的是,作为一个运算符,+作为一个新值返回表达式的结果。作为一个非链接的修改器方法,extend()在原地修改主列表并且不返回任何值。

另外,需要注意的是数组和列表是不同的。数组是在序列和列表之后添加到Python中的,用于更有效地存储整数数据类型的数组。不要混淆数组和列表。它们并不相同。

根据数组文档的描述,数组是序列类型,行为类似于列表,只是存储在其中的对象类型是受限制的。类型在对象创建时通过使用类型码指定,类型码是一个单个字符。

因此,要避免出现无限递归的问题,应使用extend()方法来拼接列表,而不是使用+操作符。同时,要注意数组和列表是不同的数据类型。

0
0 Comments

Python中的append()方法和+运算符在列表上的使用会产生不同的结果。这是为什么呢?原因在于,+运算符将数组的元素添加到原始数组中,而append()方法将数组(或任何对象)插入到原始数组的末尾,这导致在该位置产生一个对自身的引用(因此,在列表中会出现无限递归,尽管在数组中,你会收到一个类型错误)。

区别在于,+运算符在添加数组时会特殊处理(它像其他运算符一样重载,参见关于序列的这一章节),通过连接元素来进行操作。而append()方法则会按照你给定的右侧对象(数组或任何其他对象)的字面意义上进行添加,而不是获取其元素。

解决方法是使用extend()方法,如果你想要使用类似于+运算符的功能(正如其他人在这里展示的一样)。但是,尝试使用+运算符来模拟append()方法对于列表来说是不明智的(参见我之前提供的链接,了解原因)。更多关于列表的内容如下:

- +运算符将两个列表连接在一起。该运算符将返回一个新的列表对象。

- append()方法不会将一个列表追加到另一个列表中,而是在当前列表的末尾添加一个单独的对象(在这里是一个列表)。因此,将c与自身相加会导致无限递归。

- 与数组一样,你可以使用extend()方法将一个列表扩展为另一个列表(或可迭代对象)。这将直接修改你当前的列表,而不是像+运算符那样返回一个新的列表。

历史小插曲:有趣的是,Python中的数组模块是在1993年2月添加的,比序列和列表出现的时间晚得多。

Python没有数组,并且将它们与列表混淆并不是一个小问题。

以上是关于Python中append()方法和+运算符在列表上的使用导致不同结果的原因以及解决方法的整理。

0