首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

Python基础教程(第2版)学习笔记_016:第4章 字典(续3)

作者:  时间: 2011-03-21

2、copy方法

copy方法返回一个具有相同键-值对的新字典[这种方法叫做浅复制(shallow copy)],因为值本身就是相同的,并不是副本。

当在副本中(上句怎么说并不是副本呢?)对值进行替换时,并不会影响原始字典,但如果对值进行修改,却会影响原始字典,这就有个问题了:替换与修改有什么区别?现在的理解是:替换只是原地修改,不改变的字典键-值的个数;但修改却是意味着要改变字典的键-值的个数,比如添加、删除等操作。

>>> x={'xiehui':'6668','xietongxin':['6667','6665','6669']}
>>> x
{'xietongxin': ['6667', '6665', '6669'], 'xiehui': '6668'}
>>> y=x.copy()
>>> y
{'xietongxin': ['6667', '6665', '6669'], 'xiehui': '6668'}
>>> y['xiehui']='33751'
>>> y
{'xietongxin': ['6667', '6665', '6669'], 'xiehui': '33751'}
>>> x
{'xietongxin': ['6667', '6665', '6669'], 'xiehui': '6668'}
>>> y['xietongxin'].remove('6669')
>>> y
{'xietongxin': ['6667', '6665'], 'xiehui': '33751'}
>>> x
{'xietongxin': ['6667', '6665'], 'xiehui': '6668'}
>>>
阅读上面的程序,参照前面的说明应该可以读懂。

那如何避免这种现象的出现呢?毕竟有时候我们还是习惯复制结束后,对新字典的任何修改都不想让它再与原始字典发生任何联系!

使用deepcopy函数(深度复制),但需要先导入copy模块的深度复制函数

>>> x={'xiehui':'6668','xietongxin':['6667','6665','6669']}
>>> from copy import deepcopy
>>> y=deepcopy(x)
>>> y
{'xietongxin': ['6667', '6665', '6669'], 'xiehui': '6668'}
>>> y['xiehui'].remove('6668')
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    y['xiehui'].remove('6668')
AttributeError: 'str' object has no attribute 'remove'
>>> y['xietongxin'].remove('6669')
>>> y
{'xietongxin': ['6667', '6665'], 'xiehui': '6668'}
>>> x
{'xietongxin': ['6667', '6665', '6669'], 'xiehui': '6668'}
>>>

可以读懂吗?