浅谈python中字典append 到list 后值的改变问题
看一个例子
|
1
2
3
4
|
d={'test':1}d_test=dd_test['test']=2print d |
如果你在命令行实践的话,会发现你改动的是d_test ,但是d 也跟着改变了。
通常这和我们期待的不一样。
Why?
因为字典d 是一个object ,而d_test=d并没有真正的将该字典在内存中再次创建。只是指向了相同的object。这也是python 提高性能,优化内存的考虑。
实际场景
|
1
2
3
4
5
6
|
d={"name":""}l=[]for i in xrange(5): d["name"]=i l.append(d)print l |
C:\Python27\python.exe D:/py/aliexpress/test.py
[{'name': 4}, {'name': 4}, {'name': 4}, {'name': 4}, {'name': 4}]
loop 后可能跟你想要的结果并不相同。
即使append到list 中,但是,list中存放的也是一个对象,或者说是字典的地址。而非内存中真正的存储空间。
使用 .copy()方法。可以创建一个新的独立的字典
|
1
2
3
4
5
6
7
|
d={"name":""}l=[]for i in xrange(5): test=d.copy() test["name"]=i l.append(test)print l |
C:\Python27\python.exe D:/py/aliexpress/test.py
[{'name': 0}, {'name': 1}, {'name': 2}, {'name': 3}, {'name': 4}]
更新:
|
1
2
3
4
5
6
|
a={'q':1,'w':[]}b=a.copy()b['q']=2b['w'].append(123)print aprint b |
这个时候发现a中'q'的值不会变化但是其列表中的值还是发生了改变
因为copy是浅层次copy
但是这里有个track
|
1
2
3
4
5
6
|
a={'q':1,'w':[]}b=a.copy()b['q']=2b['w']=[123]print aprint b |
直接赋值的话,则不会改变a中的结构(多半是append这个方法的关系)
深层次的copy
|
1
2
3
|
import copya={'q':1,'w':[]}b=copy.deepcopy(a) |
浅谈python中字典append 到list 后值的改变问题的更多相关文章
- 浅谈python中得import xxx,from xxx import xxx, from xxx import *
在python中import跟from import都是用来导入的,但是导入的机制不同 1.import xxx:导入模块,或者文件夹,对于调用模块或者文件夹中子模块的变量或者函数,需要使用" ...
- 浅谈python中的“ ==” 与“ is”
在python中,== 与 is 之间既有区别,又有联系,本文将通过实际代码的演示,力争能够帮助读到这篇文章的朋友以最短的时间理清二者的关系,并深刻理解它们在内存中的实现机制.扯淡的话不多说,下面马上 ...
- 浅谈python中文件和文件夹的相关操作
文件操作 文件的打开与关闭 打开文件 使用open(文件名,访问方式)函数,可以打开一个已存在的文件,或者创建一个新的文件. 示例如下: f = open('test.txt') # 访问方式可以省略 ...
- 浅谈Python中的深浅拷贝的区别
深.浅拷贝总结 深拷贝 拷贝可变数据类型,如列表容器: a = [1, 2, [3, 4]] b = copy.deepcopy(a) a 与 b 所指的列表容器的空间地址不一致,即 id(a) != ...
- 浅谈python中__str__和__repr__的区别
很多时候我们在创建一个类的时候,在终端打印类或者查看的时候一般都不会得到一个太满意的结果 class T: def __init__(self): self.color="red" ...
- 浅谈python中的闭包函数
闭包函数初探 通常我们定义函数都是这样定义的 def foo(): pass 其实在函数式编程中,函数里面还可以嵌套函数,如下面这样 def foo(): print("hello worl ...
- 浅谈python中的“ ==” 与“ is”、还有cmp
总之,比较内容相等使用 ‘==’ 1.is" 是用来比较 a 和 b 是不是指向同一个内存单元,而"=="是用来比较 a 和 b指向的内存单元中的值是不是相等 2.pyt ...
- 浅谈Python中函数式编程、面向对象编程以及古怪的PythonIC
1.函数式编程作为结构化编程的一种,正在受到越来越多的重视.那么什么事函数式编程呢? 在维基百科中给出了详细的定义,函数式编程又称泛函数编程,是一种编程规范,它将函数运算视为数学上的函数计算.简单的来 ...
- 浅谈Python 中 __getattr__与__getattribute__的区别
__getattr__与__getattribute__均是一般实例属性截取函数(generic instance attribute interception method),其中,__getatt ...
随机推荐
- 在Controller中使用AOP
转:http://usherlight.iteye.com/blog/1306111 在Controller中使用AOP的问题主要在于如何让Controller能够被检测到. Controller和其 ...
- python web Tornado框架
1.Tornado Tornado:python编写的web服务器兼web应用框架 1.1.Tornado的优势 轻量级web框架异步非阻塞IO处理方式出色的抗负载能力优异的处理性能,不依赖多进程/多 ...
- CodeForces - 28C Bath Queue 概率与期望
我概率期望真是垃圾--,这题搞了两个钟头-- 题意 有\(n\)个人,\(m\)个浴室,每个浴室里有\(a_i\)个浴缸.每个人会等概率随机选择一个浴室,然后每个浴室中尽量平分到每个浴缸.问期望最长排 ...
- Vue源码阅读一:说说vue.nextTick实现
用法: 在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 疑惑: 怎么实现的延迟回调 原理: JavaScript语言的一大特点就是单线程,同一个时 ...
- mongo 生命周期
监听MongoDB的生命周期,只需重写org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener的子类 ...
- MyOD C语言代码实现
Myod C语言实现 一.题目要求 1 复习c文件处理内容 2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 main与其他分开,制作静态库和动态库 编写Ma ...
- 20175212童皓桢 《Java程序设计》第11周学习总结
20175212童皓桢 <Java程序设计>第11周学习总结 教材学习内容总结 一.URL类 1.一个URL对象通常包含最基本的三部分信息:协议.地址.资源 2.构造方法: public ...
- 【Spark机器学习速成宝典】模型篇05决策树【Decision Tree】(Python版)
目录 决策树原理 决策树代码(Spark Python) 决策树原理 详见博文:http://www.cnblogs.com/itmorn/p/7918797.html 返回目录 决策树代码(Spar ...
- linux 实现U盘自动挂载
某些场景下,服务器可能没有必要的键盘等输入设备.屏幕等输出设备.此时需要在没有人为干预的情况下实现当插入U盘或者硬盘后自动挂载,并执行某些脚本动作.以下是我的实践过程. 必要组件 udev,udisk ...
- FusionCharts的属性
FusionCharts 的 XML标签属性有一下四种数据类型 * Boolean - 布尔类型,只能为1或者0.例如:<graph showNames='1′ > * Number - ...