Python论坛  - 讨论区

标题:[python-chinese] 关于浅拷贝和深拷贝

2006年04月02日 星期日 18:52

Gu Yingbo tensiongyb at gmail.com
Sun Apr 2 18:52:56 HKT 2006

In [49]: a = {'a':{'x':1, 'y':2}, 'b':3}

In [50]: a
Out[50]: {'a': {'y': 2, 'x': 1}, 'b': 3}

In [51]: b = copy.copy(a)

In [52]: c = copy.deepcopy(a)

In [53]: b
Out[53]: {'a': {'y': 2, 'x': 1}, 'b': 3}

In [54]: c
Out[54]: {'a': {'y': 2, 'x': 1}, 'b': 3}

In [55]: c['a']['x'] = 100

In [56]: c
Out[56]: {'a': {'y': 2, 'x': 100}, 'b': 3}

In [57]: a
Out[57]: {'a': {'y': 2, 'x': 1}, 'b': 3}

In [58]: b['a']['x']=100

In [59]: b
Out[59]: {'a': {'y': 2, 'x': 100}, 'b': 3}

In [60]: a
Out[60]: {'a': {'y': 2, 'x': 100}, 'b': 3}

In [61]: b['b'] = 300

In [62]: b
Out[62]: {'a': {'y': 2, 'x': 100}, 'b': 300}

In [63]: a
Out[63]: {'a': {'y': 2, 'x': 100}, 'b': 3}


以上没有问题,说明浅拷贝的内容的第二层还是对原来对象的引用,修改它会引起原内容的改变。
但如果被拷贝对象内部包含复杂对象,如自己定义的类的一些实例,
就会产生如下情况:(a 被重新赋值了)
In [63]: b = copy.copy(a)

In [64]: c = copy.deepcopy(a)

In [65]: x in b
Out[65]: True

In [66]: x in c
Out[66]: False

In [67]: b.remove(x) # 没问题

In [68]: c.remove(x) # 出问题了
---------------------------------------------------------------------------
exceptions.ValueError                                Traceback (most recent
call last)

ValueError: list.remove(x): x not in list


这样深拷贝得到的对象就和原来的不是一模一样了,而修改浅拷贝得到的对象又会使得原来的对象(a)发生改变。
我想得到一个和 a 一模一样的对象(具有和 a 一样的方法),该怎么做呢?请大侠指教!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20060402/4b4494fb/attachment.html

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号