Python python 拷贝方式:浅拷贝 copy 和深拷贝 deepcopy

ch · December 05, 2018 · 822 hits

字典中的两种拷贝操作,刚开始比较难理解,特殊我基础比较薄弱的,不知道这样理解是否正确,希望大神们留下自己的见解

copy
方法 copy 返回一个新字典,其包含的键值对与原来的字典相同(这个方法执行的是浅复制,因为值本身是原件,而非副本)。

x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
y = x.copy()
y['username'] = 'mlh'
y['machines'].remove('bar')
y
{'username': 'mlh', 'machines': ['foo', 'baz']}
x
{'username': 'admin', 'machines': ['foo', 'baz']}

如你所见,当替换副本中的值时,原件不受影响。然而,如果修改副本中的值(就地修改而不是替换),原件也将发生变化,因为原件指向的也是被修改的值(如这个示例中的'machines'列表所示)。为避免这种问题,一种办法是执行深复制,即同时复制值及其包含的所有值,等等。为此,可使用模块 copy 中的函数 deepcopy。

deepcopy

from copy import deepcopy
d = {}
d['names'] = ['Alfred', 'Bertrand']
c = d.copy()
dc = deepcopy(d)
d['names'].append('Clive')
c
{'names': ['Alfred', 'Bertrand', 'Clive']}
dc
{'names': ['Alfred', 'Bertrand']}

1.问题一:为什么执行的是浅拷贝呢?
因为字典中有 list,可修改,修改是指值可变,两个指针只向了同一个值

2.问题二:为什么 username 的值拷贝是值不变呢?
我自己理解是因为 username 的值是 str 类型,替换是指值不可变,只能替换,重新建了空间,新的地址只向了新的值。

No Reply at the moment.
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up