浅谈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 ...
随机推荐
- 用Python实现九九乘法表打印
#!usr/bin/env python # -*- coding:utf-8 -*- # dic={ # 'apple':10, # 'iphon':5000, # 'wwatch Tv':3000 ...
- JAVA》eclipse——(三)jsp学习
导出一个war包
- jQuery attr() prop() data()用法及区别
.attr(),此方法从jq1.0开始一直存在,官方文档写的作用是读/写DOM的attribute值,其实1.6之前有时候是attribute,有时候又是property..prop(),此方法jq1 ...
- 关于system.timer的使用
private System.Timers.Timer _timer = null; if (_timer == null) { _timer = new System.Timers.Timer(); ...
- Kubernetes 基本概念和术语
Kubernetes 基本概念和术语 Kubernetes 中大部分概念如 Node.Pod.Replication Controller. Service 等都可以看做一种 "资源对象&q ...
- Oracle数据库体系结构-Shared Pool
Oracle数据库简单介绍 对象关系型数据库 重点:一致性+性能 一致性优于性能 处理模型:C/S模型 Client:用户和用户进程 Server:服务器进程,实例,数据库本身 ...
- poj 3623(贪心)
Best Cow Line, Gold Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 6038 Accepted: 20 ...
- LA 3263 好看的一笔画 欧拉几何+计算几何模板
题意:训练指南260 #include <cstdio> #include <cstring> #include <algorithm> #include < ...
- Topcoder SRM 674 Div.2题解
T1 解题思路 这题应该不是很难,主要是题意理解问题. 注意给出的两个数组里映射关系已经对应好了,只要判断是否为双射即可 参考程序 #include <bits/stdc++.h> usi ...
- 死磕java多线程
1.线程和进程 1.1线程和进程的区别 进程 它是内存中的一段独立的空间,可以负责当前应用程序的运行.当前这个进程负责调度当前程序中的所有运行细节(操作系统为进程分配一块独立的运行空间): 线程 它是 ...