浅谈python中字典append 到list 后值的改变问题
看一个例子
d={'test':1} d_test=d d_test['test']=2 print d
如果你在命令行实践的话,会发现你改动的是d_test ,但是d 也跟着改变了。
通常这和我们期待的不一样。
Why?
因为字典d 是一个object ,而d_test=d并没有真正的将该字典在内存中再次创建。只是指向了相同的object。这也是python 提高性能,优化内存的考虑。
实际场景
d={"name":""} l=[] for i in xrange(5): d["name"]=i l.append(d) print l
loop 后可能跟你想要的结果并不相同。
即使append到list 中,但是,list中存放的也是一个对象,或者说是字典的地址。而非内存中真正的存储空间。
使用 .copy()方法。可以创建一个新的独立的字典
d={"name":""} l=[] for i in xrange(5): test=d.copy() test["name"]=i l.append(test) print l
更新:
a={'q':1,'w':[]} b=a.copy() b['q']=2 b['w'].append(123) print a print b
这个时候发现a中'q'的值不会变化但是其列表中的值还是发生了改变
因为copy是浅层次copy
但是这里有个track
a={'q':1,'w':[]} b=a.copy() b['q']=2 b['w']=[123] print a print b
直接赋值的话,则不会改变a中的结构(多半是append这个方法的关系)
深层次的copy
import copy a={'q':1,'w':[]} b=copy.deepcopy(a)
以上这篇浅谈python中字典append 到list 后值的改变问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
Python列表(list)、字典(dict)、字符串(string)基本操作小结
创建列表 复制代码 代码如下: sample_list = ['a',1,('a','b')] Python 列表操作 复制代码 代码如下: sample_list = ['a','b',0,1,3] 得到列表中的某一个值 复制代码 代码如下: value_start = sample_list[0] end_value = sample_list[-1] 删除列表的第一个值 复制代码 代码如下: del sample_list[0] 在列表中插入一个值 复制代码 代码如下: sample_li
-
浅谈python中字典append 到list 后值的改变问题
看一个例子 d={'test':1} d_test=d d_test['test']=2 print d 如果你在命令行实践的话,会发现你改动的是d_test ,但是d 也跟着改变了. 通常这和我们期待的不一样. Why? 因为字典d 是一个object ,而d_test=d并没有真正的将该字典在内存中再次创建.只是指向了相同的object.这也是python 提高性能,优化内存的考虑. 实际场景 d={"name":""} l=[] for i in xrange
-
浅谈python中列表、字符串、字典的常用操作
列表操作如此下: a = ["haha","xixi","baba"] 增:a.append[gg] a.insert[1,gg] 在下标为1的地方,新增 gg 删:a.remove(haha) 删除列表中从左往右,第一个匹配到的 haha del a.[0] 删除下标为0 对应的值 a.pop(0) 括号里不写内容,默认删除最后一个,写了,就删除对应下标的内容 改:a.[0] = "gg" 查:a[0] a.index(&q
-
浅谈python中copy和deepcopy中的区别
在下是个编程爱好者,最近将魔爪伸向了Python编程.....遇到copy和deepcopy感到很困惑,现在针对这两个方法进行区分,一种是浅复制(copy),一种是深度复制(deepcopy). 首先说一下deepcopy,所谓的深度复制,在这里我理解的是完全复制然后变成一个新的对象,复制的对象和被复制的对象没有任何关系,彼此之间无论怎么改变都相互不影响. 然后说一下copy,在这里我分为两类来说,一种是字典数据类型的copy函数,一种是copy包的copy函数. 一.字典数据类型的copy函数
-
浅谈Python中的可变对象和不可变对象
什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址. 可变对象,该对象所指向的内存中的值可以被改变.变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变. Python中,数值类型(int和float).字符串str.元组tuple都是不可变类型.而列表list.字典dict.集合
-
浅谈python中统计计数的几种方法和Counter详解
1) 使用字典dict() 循环遍历出一个可迭代对象中的元素,如果字典没有该元素,那么就让该元素作为字典的键,并将该键赋值为1,如果存在就将该元素对应的值加1. lists = ['a','a','b',5,6,7,5] count_dict = dict() for item in lists: if item in count_dict: count_dict[item] += 1 else: count_dict[item] = 1 2) 使用defaultdict() defaultdi
-
浅谈Python中的异常和JSON读写数据的实现
异常可以防止出现一些不友好的信息返回给用户,有助于提升程序的可用性,在java中通过try ... catch ... finally来处理异常,在Python中通过try ... except ... else来处理异常 一.以ZeroDivisionError为例,处理分母为0的除法异常 def division(numerator,denominator): result=numerator/denominator return result ret1=division(1,5) prin
-
浅谈Python中对象是如何被调用的
目录 楔子 从 Python 的角度看对象的调用 从解释器的角度看对象的调用 小结 楔子 我们知道对象是如何被创建的,主要有两种方式,一种是通过Python/C API,另一种是通过调用类型对象.对于内置类型的实例对象而言,这两种方式都是支持的,比如列表,我们即可以通过[]创建,也可以通过list(),前者是Python/C API,后者是调用类型对象. 但对于自定义类的实例对象而言,我们只能通过调用类型对象的方式来创建.而一个对象如果可以被调用,那么这个对象就是callable,否则就不是ca
-
浅谈Python中函数的参数传递
1.普通的参数传递 >>> def add(a,b): return a+b >>> print add(1,2) 3 >>> print add('abc','123') abc123 2.参数个数可选,参数有默认值的传递 >>> def myjoin(string,sep='_'): return sep.join(string) >>> myjoin('Test') 'T_e_s_t' >>>
-
浅谈python中的getattr函数 hasattr函数
hasattr(object, name) 作用:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的). 示例: >>> hasattr(list, 'append') True >>> hasattr(list, 'add') False getattr(object,name,default): 作用:返回object的名称为name的属性的属性值,如果属性name存在,则直接返回其
-
浅谈python中的数字类型与处理工具
python中的数字类型工具 python中为更高级的工作提供很多高级数字编程支持和对象,其中数字类型的完整工具包括: 1.整数与浮点型, 2.复数, 3.固定精度十进制数, 4.有理分数, 5.集合, 6.布尔类型 7.无穷的整数精度 8.各种数字内置函数及模块. 基本数字类型 python中提供了两种基本类型:整数(正整数金额负整数)和浮点数(注:带有小数部分的数字),其中python中我们可以使用多种进制的整数.并且整数可以用有无穷精度. 整数的表现形式以十进制数字字符串写法出现,浮点数带
随机推荐
- 详解IOS UITableViewCell 的 imageView大小更改
- Windows下Redis安装配置简单教程
- 详解Spring boot使用Redis集群替换mybatis二级缓存
- iOS应用中使用Toolbar工具栏方式切换视图的方法详解
- 微信小程序中单位rpx和rem的使用
- PHP 实现等比压缩图片尺寸和大小实例代码
- source.php查看源文件
- python文件读写并使用mysql批量插入示例分享(python操作mysql)
- Python面向对象特殊成员
- Android编程实现创建,删除,判断快捷方式的方法
- mysql中IFNULL,IF,CASE的区别介绍
- 实例讲解多个js毫秒倒计时同时进行效果
- javascript操作cookie方法函数集合第1/2页
- linux 安装过程全攻略
- 图文详解Java环境变量配置方法
- python连接MySQL数据库实例分析
- Replace关键字的妙用查询是否包含某个特定字符串
- Three.js利用顶点绘制立方体的方法详解
- Python提取Linux内核源代码的目录结构实现方法
- 锁定表列