【问题标题】:Why Deepcopy in Python not creating new objects for single int values? [duplicate]为什么 Python 中的 Deepcopy 不为单个 int 值创建新对象? [复制]
【发布时间】:2021-04-23 20:42:42
【问题描述】:

我需要在这里澄清一下这个概念,我正在 python 中尝试.deepcopy(),我已经阅读了:

深拷贝构造一个新的复合对象,然后递归地将副本插入到原始对象中。

但是,在下面的代码中,我可以看到 x[0] = y[0]x[1] = y[1] 的 ID,但 x[2] != y[2] 的 ID,这是有道理的,因为它插入了对象的副本。但是为什么x[0]的ID等于y[0]x[1]等于y[1]呢?

这是我尝试过的代码:

x=[1,2,[3,4]]
y=cp.deepcopy(x)
print(id(x),id(y))

for i in range(len(x)):
    print(id(x[i]),id(y[i]))

输出:

923236765248 923256513088
140729072564000 140729072564000
140729072564032 140729072564032
923256458496 923256516928

【问题讨论】:

  • 您将无法仅使用ints 来验证此行为。它们经过优化以具有相同的id。尝试对它们进行简单的包装,你会看到你得到了新的对象。
  • 我认为这与解释器中某处的引用类型与值类型有关
  • 它只复制可变对象。
  • @quamrana 确切地说,优化只针对小整数。
  • 很确定@quamrana 和 barmar 是对的。是的,这是一个深拷贝,如果您更改 y[2][0] 处的值,它不会更改 x[2][0] 处的值,但在更改之前它们将具有相同的 id。跨度>

标签: python list copy nested-lists deep-copy


【解决方案1】:

在这个例子中,我使用obj 作为另一个值的包装器:

import copy as cp

class obj:
    def __init__(self, i):
        self.i = i
    def __repr__(self):
        return f'obj({self.i})'


x=[obj(1),obj(2),[obj(3),obj(4)]]
y=cp.deepcopy(x)
print(id(x),id(y))

for i in range(len(x)):
    print(id(x[i]),id(y[i]))

输出显示所有不同的数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    相关资源
    最近更新 更多