一个易犯的错误,关于 Python 的传值(对于不可变量) 和 传引用(对于可变量),浅拷贝和深拷贝。废话不多说,看例子,

直接改变可变字典值,失败,

>>> dic = dict.fromkeys(range(5), [])
>>> dic
{0: [], 1: [], 2: [], 3: [], 4: []}
>>> dic[0]
[]
>>> dic[0].append(123)
>>> dic
{0: [123], 1: [123], 2: [123], 3: [123], 4: [123]}
>>>

间接改变可变字典值,失败。

>>> dic = dict.fromkeys(range(5), [])
>>> dic
{0: [], 1: [], 2: [], 3: [], 4: []}
>>> v = dic[0]
>>> v
[]
>>> v.append(123)
>>> v
[123]
>>> dic
{0: [123], 1: [123], 2: [123], 3: [123], 4: [123]}

切片浅拷贝,对于非嵌套可变字典值,赋单值,成功,

>>> dic = dict.fromkeys(range(5), [])
>>> dic
{0: [], 1: [], 2: [], 3: [], 4: []}
>>> v = dic[0][:]
>>> v
[]
>>> v.append(123)
>>> v
[123]
>>> dic
{0: [], 1: [], 2: [], 3: [], 4: []}
>>>
>>> dic[0] = v
>>> dic
{0: [123], 1: [], 2: [], 3: [], 4: []}

切片浅拷贝,对于非嵌套可变字典值,赋可变列表,成功,

>>> dic = dict.fromkeys(range(5), [])
>>> dic
{0: [], 1: [], 2: [], 3: [], 4: []}
>>> v = dic[0][:]
>>> v.append([1, 2, 3])
>>> v
[[1, 2, 3]]
>>>
>>> dic[0] = v
>>> dic
{0: [[1, 2, 3]], 1: [], 2: [], 3: [], 4: []}

copy.copy 浅拷贝,成功,

>>> dic = dict.fromkeys(range(5), [])
>>> dic
{0: [], 1: [], 2: [], 3: [], 4: []}
>>>
>>> v = copy.copy(dic[0]) # shallow copy
>>> v
[]
>>> v.append([1, 2, 3])
>>> v
[[1, 2, 3]]
>>>
>>> dic[0] = v
>>> dic
{0: [[1, 2, 3]], 1: [], 2: [], 3: [], 4: []}
>>>

copy.deepcopy 深拷贝,成功,这个最靠谱。

>>> dic = dict.fromkeys(range(5), [])
>>> dic
{0: [], 1: [], 2: [], 3: [], 4: []}
>>>
>>> v = copy.deepcopy(dic[0])
>>> v
[]
>>> v.append([1, 2, 3])
>>> v
[[1, 2, 3]]
>>>
>>> dic[0] = v
>>> dic
{0: [[1, 2, 3]], 1: [], 2: [], 3: [], 4: []}
>>>

完。

最新文章

  1. 53. 特殊的O(n)时间排序[sort ages with hashtable]
  2. getComputedStyle的应用
  3. C++的友元类和友元函数实例
  4. 关于HttpURLConnection.setFollowRedirects
  5. php删除指定目录所有文件
  6. Python特殊语法:filter、map、reduce、lambda [转]
  7. 遍历JObject
  8. Windows Phone开发-开发环境和结构
  9. 【HDU1394】Minimum Inversion Number(线段树)
  10. hdu4190 简单的二分法
  11. viim命令行模式查找替换
  12. epoll通俗讲解
  13. IDEA项目搭建六——使用Eureka和Ribbon进行项目服务化
  14. BZOJ1024:[SCOI2009]生日快乐(DFS)
  15. [转载]转,Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数
  16. FBX SDK在vs 2010下面的配置
  17. 【LeetCode】数组移除元素
  18. HIVE点滴:group by和distinct语句的执行顺序
  19. ret和retf
  20. python 正则表达式替换字符串中匹配的字符

热门文章

  1. 洛谷P2470 [SCOI2007]压缩(区间dp)
  2. SQL注入与防范
  3. Java虚拟机(四)垃圾收集算法
  4. springboot 常见请求方式
  5. RHEL下SendMail修改发邮箱地址
  6. java----构造回文字符串java(动态规划)【手写演算残图】
  7. C#-hello world(二)
  8. javaweb分页查询实现
  9. 自动化测试基础篇--Selenium select下拉框
  10. phpstorm设置背景图片