Python共享引用[重复]

Posted

技术标签:

【中文标题】Python共享引用[重复]【英文标题】:Python shared references [duplicate] 【发布时间】:2018-01-14 04:42:29 【问题描述】:

我对以下代码感到困惑

L1 = [3,6,9,12]
L2 = [L1]*3
L3=[list(L1)]*3
L4 = [list(L1) for i in range(3)]
L1[0]=100

 L2
[[100, 6, 9, 12], [100, 6, 9, 12], [100, 6, 9, 12]]

L3
[[3, 6, 9, 12], [3, 6, 9, 12], [3, 6, 9, 12]]

L4
[[3, 6, 9, 12], [3, 6, 9, 12], [3, 6, 9, 12]]

为什么L3L4不受第五行代码影响?这意味着只有L2L1 共享对象。有人能解释一下为什么L3L4 不创建共享对象而只有L2 可以吗?

【问题讨论】:

【参考方案1】:

list(foo) 创建一个新的列表对象,该对象复制foo 中项目的各个值。因此,修改 foo 对象(在您的情况下为 L1)不会影响新列表中的值。

L2 是一个包含 3 个对 L1 的引用的列表。

L3L4 是列表,每个列表包含 3 个 L1 副本。

您可以使用id() 函数来观察这一点。

【讨论】:

特别是浅拷贝列表;更改整个元素不会反映更改,但会改变意志内的任何对象。

以上是关于Python共享引用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Spring jpa Exception - 找到对集合的共享引用[重复]

零基础学python-6.2 共享引用

Python-共享引用

Python中对象的引用和共享引用

无法在 Python 中加载共享对象文件 [重复]

如何在不传递引用的情况下在 Python 中使用 SyncManager 跨进程共享列表