Python 字典一个易犯的错误
一个易犯的错误,关于 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 字典一个易犯的错误的更多相关文章
- javascript中易犯的错误有哪些
javascript中易犯的错误有哪些 一.总结 一句话总结: 比如循环中函数的使用 函数中this的指向谁(函数中this的使用) 变量的作用域 1.this.timer = setTimeout( ...
- Python初学的易犯错误
当初学 Python 时,想要弄懂 Python 的错误信息的含义可能有点复杂.这里列出了常见的的一些让你程序 crash 的运行时错误. 1)忘记在 if , elif , else , for , ...
- 关于TextView的setText()与Integer之间一个易犯的小错误
[转载]原文:https://my.oschina.net/xybob/blog/59524 先上图: TextView的setText()函数的两个重载函数 因为TextView有两个不同的重载函数 ...
- python开发中容易犯的错误整合
写在前面 长期更新的博文.多数是一些比较隐蔽的问题.欢迎留言补充. pip并不是那么安逸 pip安装对于开发者来说确实是一种解放.可以自动安装依赖包,但执行最简单的pip安装命令时,并不是所有的依赖都 ...
- js函数易犯的错误
1.定义一个js函数时不能写在另一个函数里面. 2.定义一个打开网页自动执行的函数,一定要注意加载的顺序.如果是不是自动执行的,而是等页面加载完后事件触发的,那写在任何地方都没问题. 错误的:
- 初学者刚学c++在定义类时只有成员变量易犯的错误
------------------------ #include<iostream> using namespace std;//c++的命名空间 class circle { publ ...
- jquery初学者易犯的错误
1 获取类或者对象的时候,忘记写“#”或者“.” 错误案例: $(document).ready(function(){ $("btn1").click(function(){ a ...
- php一些易犯的错误
1.mysql数据库字段是区分大小写的.字段在数组中要小写.(数据库字段UE_account) 错误的:
- iOS定位权限请求时易犯的错误小结
起因 用户群反馈app可能请求了不合适的定位权限:始终定位. 看到这个截图,根据经验判断可能是后台定位功能导致可能不得不请求始终定位权限.再加上之前提交审核时,苹果要求在plist文件中新增NSLoc ...
随机推荐
- Linux上Simplescalar/ARM的安装和运行文档
本文是基于ARM的simplescalar在ubuntu下的安装说明 1.1 软件下载 *********************文件下载地址:http://yunpan.cn/cw2n7dAyfG ...
- jstack 排查 java 进程占用大量 CPU 问题
1. top 看看哪个进程是罪魁祸首 2.将这个进程的jstack dump 到一个文件里面,以备使用. jstack -l 25886 > /tmp/jstack.log # 如果报错,则加 ...
- [待优化笔记]原生JS实现验证框架 checkFun
;(function(){ /** 验证框架 checkFun * 使用方法: * <input class="required" type="text" ...
- JS之汉字与Unicode码的相互转化
有时候,我们在给后端传递变量的的值中有汉字,可能由于编码的原因,传递到后端后变为乱码了.所以有时候为了省事或者其它特殊要求的时候,会把传递的汉字转换成Unicode编码后再进行传递. 当然汉字转换成u ...
- 2018-08-11 中文代码示例之Spring Boot 2.0.3问好
上次试用Spring Boot还是两年前: 中文代码示例之Spring Boot 1.3.3演示. 打算用在一个讨论组内小项目上, 于是从官网Building an Application with ...
- 2018-05-09 5分钟入门CTS-尝鲜中文版TypeScript
知乎原链 本文为中文代码示例之5分钟入门TypeScript的CTS版本. CTS作者是@htwx(github). 它实现了关键词和标准库的所有命名汉化. 本文并未使用附带的vscode相关插件(包 ...
- Spring声明式事务配置
1.首先在/WEB-INF/applicationContext.xml添加以下内容: <!-- 配置事务管理器 --> <bean id="transactionMana ...
- RPC理论以及Dubbo的使用介绍
RPC 的主要功能目标是让构建分布式应用更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性. 为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用. RP ...
- Android包管理机制(一) PackageInstaller的初始化
前言 包管理机制是Android中的重要机制,是应用开发和系统开发需要掌握的知识点之一. 包指的是Apk.jar和so文件等等,它们被加载到Android内存中,由一个包转变成可执行的代码,这就需要一 ...
- Oracle EBS compile PLD PLL files.
PLL->PLX:frmcmp_batch module_type=library userid=apps/apps module=$1.pll output_file=$1.plx compi ...