当前位置: 首页 > 知识库问答 >
问题:

Python列表副本-混乱[重复]

邓韬
2023-03-14

这里是Python初学者。阅读一篇关于列表参考的文章,浅拷贝和深拷贝,尝试了以下内容:

a = ['a', 'b', 'c']
b = list(a)
a[0] = 'A'

预期产出:

>>>a
['A', 'b', 'c']
>>>b
['A', 'b', 'c']

实际产出:

>>>a
['A', 'b', 'c']
>>>b
['a', 'b', 'c']

但是,它适用于以下情况:

xs = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> ys = list(xs)  # Make a shallow copy

xs[1][0] = 'X'

>>> xs
[[1, 2, 3], ['X', 5, 6], [7, 8, 9]]
>>> ys
[[1, 2, 3], ['X', 5, 6], [7, 8, 9]]

有人能解释一下我是不是遗漏了什么吗?谢谢你们

Python 3.7。4.

文章链接:https://realpython.com/copying-python-objects/

共有3个答案

阎承嗣
2023-03-14

当您说b=list(a)时,您正在创建一个新的列表b,其值与a中的值相同。此时,每个列表的元素是相等的,但它们不是同一个对象。也就是说,其中一个对象中的更改不会反映在另一个对象中。他们是独立的。

如果你说b=a,你是说ba是引用相同对象的名称。

蓝华皓
2023-03-14

list()创建一个新列表,这意味着对原始列表的更改不会影响新列表。

宁飞宇
2023-03-14

这是因为list()函数生成了一个新列表,如果在赋值后对原始列表进行更改,则新列表不会更改。

您可以使用变量值来实现这一点,但是要小心,例如

var = 'a'
list1 = [var, 'a', 'b']
list2 = list1

print(list1)
print(list2)

输出:

['a', 'a', 'b']
['a', 'a', 'b']

您可以更改var的值,两个列表都将更改,除非您:

var = 'a'
list1 = [var, 'a', 'b']
var = 'c'
list2 = list1

print(list1)
print(list2)

输出:

['a', 'a', 'b']
['a', 'a', 'b']

为什么?因为当您执行list1=[var,'a','b']var时,其值为'a',但是当您更改其值时,这不会影响list1,因为它保存了var本身的值,所以list2也不受影响

 类似资料:
  • 问题内容: 我几个月前安装了Node JS,并玩了一些。今天,我想开始学习有关节点的更多信息,并且在编码之前,我决定要确保自己具有最新版本。 我检查了版本,它就像v0.10.3x。我查看了NodeJS网站,它显示的最新版本为v4.1.0。所以我以为哇!我最好升级一下,我简直不敢相信它在短短几个月内就迅速升级到了4.x版本。 我花了很多时间试图弄清楚如何完全卸载node和npm,因为我似乎无法升级它

  • 我真的很困惑值是如何传递给一个函数的。我无法弄清楚当我们把它传递给函数时,什么类型的值会被改变。 示例1-向函数传递字符串(引用类型)- 输出: 示例2-向函数传递String[]数组- 输出: null

  • 看了很多视频,看了一本书,我不清楚什么时候什么时候不使用noexcept。 所有的书都说,只有当函数永远不会抛出时,才应该使用noexcept。 我觉得应该用别的。许多人说分配函数不应该是noexcept,但是如果我不想捕捉这些错误,并且调用< code>std::terminate是可以接受的,该怎么办呢? 简而言之,是否应该在永远不会抛出的函数或除您希望从中捕获异常的函数之外的所有函数上使用n

  • 如果您编译它,然后用运行它,它将打印:b ...所以它要取第一个数组,并自动包装它以适应二维数组??真奇怪。有人能解释一下这是怎么回事吗?我很确定我错过了什么。

  • 我正在Android(移动设备a)上执行UUID过滤扫描,我有两个测试用例。 一个人在另一个Android设备(移动设备b)上使用一个名为BLE扫描仪的应用程序来创建一个具有两个测试服务的BLE服务器(每个服务都有自己唯一的UUID)。另一种是通过Arduino BLE服务器,为其服务定制UUID。 如果我使用移动设备B的BLE扫描仪应用程序并扫描arduino,我可以找到它,连接到它并查看服务以

  • 据我解释,可以用任何表示,其中是或的超级类。同样的逻辑适用于也是。那么是?

  • 这两种处理堆栈和队列的方法有什么区别?两者都叫什么? 第一种方式: 第二种方式: 它们是否正确?试图学好这些,但互联网上的解释却模糊不清。。

  • 问题内容: 在下面的示例中,如果1000都是int(我认为它们都是),为什么底部不能编译? 问题答案: 经营者 运算符将操作数组合成表达式。 比较在其他地方讨论。对于其他二进制运算符,除非操作涉及移位或未类型化的常量,否则操作数类型必须相同。对于仅涉及常量的操作,请参见关于常量表达式的部分。 除移位操作外,如果一个操作数是未类型化的常量,而另一个操作数不是,则该常量将转换为另一种操作数的类型。 例