浅谈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 ...
 
随机推荐
- web性能优化-浏览器工作原理
			
要彻底了解web性能优化的问题,得搞清楚浏览器的工作原理. 我们需要了解,你在浏览器地址栏中输入url到页面展示的短短几秒中,浏览器究竟做了什么,才能了解到为什么我们口中所说的优化方案能够起到优化作用 ...
 - vue 里面异步加载高德地图
			
前言 关于Vue 里面使用异步加载高德地图 项目中其实只有几处需要用到地图,不需要全局引入 在index文件中引入js会明显拖慢首屏加载速度,虽然可以使用异步加载script的方式解决,但是始终觉得不 ...
 - 4.2 会议室预定系统,ajax参数(未完成)
			
参考blog https://www.cnblogs.com/alice-bj/p/9191082.html https://www.cnblogs.com/yuanchenqi/articles/7 ...
 - MAC使用终端DISKUTIL命令给U盘分区(解决window优盘只有200M)
			
1.先使用diskutil list命令查看U盘代号 2.然后用下面的命令把它格式化: sudo diskutil eraseDisk FAT32 USB_NAME MBRFormat /dev/di ...
 - viewport的相关知识点
			
主要说一些viewport的基本原理以及使用 ㈠概念 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤到很小的 ...
 - Controllers的使用
			
代码 angularjs.html <!doctype html> <html> <head> <meta charset="UTF-8" ...
 - 冒泡排序和选择排序(bubble sort and selection sort)
			
Bubble sort Basic Method: import random nums = [random.randint(1,20) for _ in range(10)] #制作一个无序数字列表 ...
 - 51 Nod N^N的末位数字
			
1004 n^n的末位数字 题目来源: Author Ignatius.L (Hdu 1061) 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 给 ...
 - luoguP3353 在你窗外闪耀的星星
			
P3353 在你窗外闪耀的星星 题目描述 飞逝的的时光不会模糊我对你的记忆.难以相信从我第一次见到你以来已经过去了3年.我仍然还生动地记得,3年前,在美丽的集美中学,从我看到你微笑着走出教室,你将头向 ...
 - python中super().__init__和类名.__init__的区别
			
super().__init__相对于类名.__init__,在单继承上用法基本无差 但在多继承上有区别,super方法能保证每个父类的方法只会执行一次,而使用类名的方法会导致方法被执行多次 多继承时 ...