看一个例子

1
2
3
4
d={'test':1}
d_test=d
d_test['test']=2
print 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']=2
b['w'].append(123)
print a
print b

这个时候发现a中'q'的值不会变化但是其列表中的值还是发生了改变

因为copy是浅层次copy

但是这里有个track

1
2
3
4
5
6
a={'q':1,'w':[]}
b=a.copy()
b['q']=2
b['w']=[123]
print a
print b

直接赋值的话,则不会改变a中的结构(多半是append这个方法的关系)

深层次的copy

1
2
3
import copy
a={'q':1,'w':[]}
b=copy.deepcopy(a)

最新文章

  1. JSON简单介绍
  2. python property详解
  3. PHP isset() 检测变量是否设置
  4. struts2理解
  5. AlphaGo实现原理
  6. Ubuntu1404+Django1.9+Apache2.4部署配置2配置文件设置
  7. Object.defineProperty 规则
  8. JavaSE复习日记 : 抽象类
  9. gym102007 E
  10. Mybatis之分页插件pagehelper的简单使用
  11. linux中断源码分析 - 概述(一)
  12. Android学习指南之三十八:Android手势操作编程[转]
  13. JavaScript -- Table-方法
  14. Macos mysql 8.0.11 添加配置文件
  15. 案例:使用scan IP无法连接数据库
  16. jmeter线程组介绍
  17. 21-py3 发邮件
  18. C++ Primer Plus学习:第十三章
  19. iOS开发NSDate详解
  20. 学习apache commons lang3的源代码 (2):RandomStringUtils

热门文章

  1. Linux不同机器文件挂载
  2. gulp[13124]: c:\ws\src\node_contextify.cc:626: Assertion `args[1]->IsString()' failed
  3. @RequestParam和@PathVariable用法小结
  4. Nowcoder 挑战赛23 B 游戏 ( NIM博弈、SG函数打表 )
  5. HGOI20190707 题解
  6. 彩色图像--色彩空间 CMY(K)空间
  7. kmeans与kmeans++的python实现
  8. MongoDB下载以及安装
  9. CodeForces–471D--MUH and Cube Walls(KMP)
  10. Spring-data-redis 第一天