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 = [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 中的,作为存储整数数据类型数组的更高效的方式。不要将arrays 与lists 混淆。它们并不相同。

来自数组文档:

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

解决方案 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 。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用