Python 复制列表列表[重复]

2025-02-14 09:50:00
admin
原创
39
摘要:问题描述:我使用的是 python 3.4.1。 对于单个列表a=[1,2],如果我复制它,b = a.copy()当我更改 中的项目时b,它不会更改 中的项目a。 但是,当我定义列表列表(实际上是一个矩阵)时a = [[1,2],[3,4]],当我分配b = a.copy()。我对列表所做的操作b实际上...

问题描述:

我使用的是 python 3.4.1。

对于单个列表a=[1,2],如果我复制它,b = a.copy()当我更改 中的项目时b,它不会更改 中的项目a

但是,当我定义列表列表(实际上是一个矩阵)时a = [[1,2],[3,4]],当我分配b = a.copy()。我对列表所做的操作b实际上会影响a

我检查了它们的地址,它们是不同的。

有人能告诉我为什么吗?

ps:我做的是b[0][0] = x,并且a中的项目也改变了。


解决方案 1:

来自模块的文档copy

浅复制和深复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例)有关:

  • 浅拷贝构造一个新的复合对象,然后(在可能的范围内)将对原始对象的引用插入到其中。

  • 深层复制构造一个新的复合对象,然后以递归方式将原始对象的副本插入其中。

当您调用常规时,copy.copy()您正在执行浅表复制。这意味着,在列表列表的情况下,您将获得外部列表的新副本,但它将包含原始内部列表作为其元素。相反,您应该使用copy.deepcopy(),这将创建外部和内部列表的新副本。

您在第一个使用示例中没有注意到这一点的原因copy([1,2])是,像 这样的原语int是不可变的,因此不可能在不创建新实例的情况下更改它们的值。 如果列表的内容是可变对象(如列表或任何具有可变成员的用户定义对象),则这些对象的任何变异都会在列表的两个副本中看到。

解决方案 2:

也许是这样的列表理解:

new_list = [x[:] for x in old_list]

...但是如果你的矩阵深度超过一层,列表理解可能不如仅仅使用那么优雅deepcopy

编辑 - 如上所述,浅拷贝仍将包含对列表内对象的引用。例如...

>>> this = [1, 2]
>>> that = [33, 44]
>>> stuff = [this, that]
>>> other = stuff[:]
>>> other
[[1, 2], [33, 44]]
>>> other[0][0] = False
>>> stuff
[[False, 2], [33, 44]]    #the same problem as before
>>> this
[False, 2]                #original list also changed
>>> other = [x[:] for x in stuff]
>>> other
[[False, 2], [33, 44]]
>>> other[0][0] = True
>>> other
[[True, 2], [33, 44]]
>>> stuff
[[False, 2], [33, 44]]    #copied matrix is different
>>> this
[False, 2]                #original was unchanged by this assignment

解决方案 3:

非常简单,只需这样做:

b = a

例如:

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

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用