【问题标题】:python objects references and deep copypython对象引用和深拷贝
【发布时间】:2018-10-21 22:06:02
【问题描述】:

我突然有点迷茫,我现在可能累了,所以这可能是原因。

无论如何考虑以下使用解释器:

> x = {'hello':'world'}
> y=x

> x= None

>y
y={'hello':'world'}

为什么y = None 不是y 现在引用与更改后的 x 相同的值?

第二个问题:
有什么区别:

x= {'test':1}
y = dict(x)
VS  
y = copy.deepcopy(x)

【问题讨论】:

  • y 不指向x 它指向x 的数据......如果你在别处指向xy 不受它的影响。 - 尝试x["hello"] = 42 并评估y
  • y 引用的值与x 最初的值相同。然后你将x 反弹到别的东西,但这不会影响y。您的deepcopy 示例并不是非常有用,因为您无法真正看到使用strint 等非可变类型的区别。尝试使用x = {'test': [1,2,3]} 并尝试操作这些值,您会看到差异。

标签: python python-3.x reference


【解决方案1】:

在这种情况下,字典对象{'hello': 'world'} 在内存中创建,然后x 被分配为对其的引用。分配y=x 会将second 引用分配给字典对象,这次是y

但是,y 不是指向x 指针的指针。重新分配 x 不会改变 y 所引用的内容。


对于你的第二个问题,在这种特定情况下,没有区别。

使用:

x = {'test':1}
y = dict(x)

创建字典的新副本并将其分配给y

使用:

y = copy.deepcopy(x)

创建一个相同的副本。当字典的值是一个可变对象(如列表)时,您会看到不同之处。

这里,yx 的浅拷贝:

x = {'test': [1,2,3]}
y = dict(x)

因此更改x 引用的字典对象内部的列表也将出现在y 中。

x['test'][1] = 0
y
# returns:
{'test': [1, 0, 3]}

但是,使用:

x = {'test': [1,2,3]}
y = copy.deepcopy(x)

将创建主对象以及它包含的所有对象的副本。所以现在修改x中的列表不会改变y的值。

x['test'][1] = 0
y
# returns
{'test': [1,2,3]}

【讨论】:

    猜你喜欢
    • 2012-02-20
    • 2015-01-13
    • 2015-09-14
    • 2017-08-30
    • 1970-01-01
    • 2012-04-12
    • 2011-04-11
    • 2012-06-19
    • 2019-11-17
    相关资源
    最近更新 更多