一个易犯的错误,关于 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: []}
>>>

完。

Python 字典一个易犯的错误的更多相关文章

  1. javascript中易犯的错误有哪些

    javascript中易犯的错误有哪些 一.总结 一句话总结: 比如循环中函数的使用 函数中this的指向谁(函数中this的使用) 变量的作用域 1.this.timer = setTimeout( ...

  2. Python初学的易犯错误

    当初学 Python 时,想要弄懂 Python 的错误信息的含义可能有点复杂.这里列出了常见的的一些让你程序 crash 的运行时错误. 1)忘记在 if , elif , else , for , ...

  3. 关于TextView的setText()与Integer之间一个易犯的小错误

    [转载]原文:https://my.oschina.net/xybob/blog/59524 先上图: TextView的setText()函数的两个重载函数 因为TextView有两个不同的重载函数 ...

  4. python开发中容易犯的错误整合

    写在前面 长期更新的博文.多数是一些比较隐蔽的问题.欢迎留言补充. pip并不是那么安逸 pip安装对于开发者来说确实是一种解放.可以自动安装依赖包,但执行最简单的pip安装命令时,并不是所有的依赖都 ...

  5. js函数易犯的错误

    1.定义一个js函数时不能写在另一个函数里面. 2.定义一个打开网页自动执行的函数,一定要注意加载的顺序.如果是不是自动执行的,而是等页面加载完后事件触发的,那写在任何地方都没问题. 错误的:

  6. 初学者刚学c++在定义类时只有成员变量易犯的错误

    ------------------------ #include<iostream> using namespace std;//c++的命名空间 class circle { publ ...

  7. jquery初学者易犯的错误

    1 获取类或者对象的时候,忘记写“#”或者“.” 错误案例: $(document).ready(function(){ $("btn1").click(function(){ a ...

  8. php一些易犯的错误

    1.mysql数据库字段是区分大小写的.字段在数组中要小写.(数据库字段UE_account) 错误的:

  9. iOS定位权限请求时易犯的错误小结

    起因 用户群反馈app可能请求了不合适的定位权限:始终定位. 看到这个截图,根据经验判断可能是后台定位功能导致可能不得不请求始终定位权限.再加上之前提交审核时,苹果要求在plist文件中新增NSLoc ...

随机推荐

  1. 判断浏览器的名称,区分360的ie和谷歌内核

    function getBrowserInfo() { var ua = navigator.userAgent.toLocaleLowerCase(); var browserType = null ...

  2. CSS使用position:sticky 实现粘性布局

    简介 前面写了一篇文章讲解了position常用的几个属性:<CSS 属性之 position讲解>一般都知道下面几个常用的: { position: static; position: ...

  3. C# 8.0的三个值得关注的新特性

    本文翻译自:https://dzone.com/articles/3-new-c-8-features-we-are-excited-about 转载请注明出自:葡萄城官网,葡萄城为开发者提供专业的开 ...

  4. Android项目实战(四十八):架构之组件化开发

    什么要组件化开发? 看一下普通项目的结构 , 一个项目下有多个Module(左侧图黑体目录),但是只有一个application,0个或多个library(在每个medel下的build.gradle ...

  5. ButterKnife注解框架详解

    Android 懒人注解框架 :https://github.com/JakeWharton/butterknife 前言: 注解,相信很多同学都用到了,对控件进行初始化的时候需要用到 findVie ...

  6. GitHub Flow & Git Flow 基于Git 的两种协作开发模式

    介绍基于Git 两种协作开发模式,GitHub Flow & Git Flow 对于Github 一些好用的特殊操作技巧 ,可以见GitHub 特殊操作技巧 和Git的基本操作 一 GitHu ...

  7. 编程一小时 code.org [六一关注]

    编程一小时活动的组织者是Code.org, 它是一个面向公众的公益组织,致力于在更多的学校推广计算机科学教育,并为女性和就业率低的有色人种学生学习计算机的机会.同时,一个空前强大的合作伙伴联盟也在支持 ...

  8. java----java集合框架图

  9. mysql练习----SUM and COUNT/zh图(二)

    世界国家概况 GROUP BY 和 HAVING 通过包括一个GROUP BY子句功能, SUM并将COUNT 其应用于共享值的项目组.当你指定 GROUP BY continent 结果是每个不同的 ...

  10. [20190322]测试相同语句遇到导致cursor pin S的疑问.txt

    [20190322]测试相同语句遇到导致cursor pin S的疑问.txt--//昨天测试遇到的情况,链接:http://blog.itpub.net/267265/viewspace-26388 ...