浅谈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 ...
随机推荐
- OpenCV笔记(5)(定位票据并规范化、调库扫描文本)
一.定位和变换票据 定位照片中的不规范票据或矩形文本,并将其变换为正规矩形,以供OCR识别. # -*- coding:utf-8 -*- __author__ = 'Leo.Z' import cv ...
- CMD命令行基本命令
基本知识 输入 功能 Alt+Enter 全屏 Ctrl+S 暂停输出 Ctrl+C Ctrl+Break 停止程序 Ctrl+Z 表示输入结束 <file 从文件读标准输入 >file ...
- 学习sklearn聚类使用
学习利用sklearn的几个聚类方法: 一.几种聚类方法 1.高斯混合聚类(mixture of gaussians) 2.k均值聚类(kmeans) 3.密度聚类,均值漂移(mean shift) ...
- HDU 3507 [Print Article]DP斜率优化
题目大意 给定一个长度为\(n(n \leqslant 500000)\)的数列,将其分割为连续的若干份,使得 $ \sum ((\sum_{i=j}^kC_i) +M) $ 最小.其中\(C_i\) ...
- php的switch函数
PHP Switch 语句 PHP If...Else PHP While 循环 switch 语句用于基于不同条件执行不同动作. Switch 语句 如果您希望有选择地执行若干代码块之一,请使用 S ...
- 6张图解释IO流
1.字节流InputStream 2.字节流OutputStream 3.字符流Reader 4.字符流Writer 5.节点流 6.处理流 总结: 节点流可以直接连接在数据源上,处理流不可以:节点流 ...
- Spring Data概览
总结:JpaRepository继承PagingAndSortingRepository,PagingAndSortingRepository继承CrudRespository,CrudResposi ...
- maven国内镜像、国内外仓库(直接下载jar)
阿里: https://maven.aliyun.com/mvn/search 官方: http://repo.maven.apache.org/maven2/ maven仓库 阿里巴巴的镜像仓库, ...
- moment 时间格式化
使用方法: 引入 moment 的包 moment(要处理的时间).format(时间的格式): vue 的过滤器为例: str 代表要处理的时间 orf 代表 时间的格式
- leetcode-easy-math-326. Power of Three
mycode class Solution(object): def isPowerOfThree(self, n): """ :type n: int :rtype: ...