博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
列表中的陷阱
阅读量:6418 次
发布时间:2019-06-23

本文共 809 字,大约阅读时间需要 2 分钟。

列表是python中常用的一种数据结构,能够存放任意的其他数据类型,int、str、list 、tuple等,但是最近发现了一个问题,代码如下

data = []buff = dict()for i in range(5):    buff['d'] = i    data.append(buff)print(data)

原本以为打印的结果会是

[{'d':0},{'d':1},{'d':2},{'d':3},{'d':4}]

但是最终的结果为

[{'d':4},{'d':4},{'d':4},{'d':4},{'d':4}]

最后发现其实当我们使用列表存储数据的时候,只是把数据的内存地址给存入列表中了而不是数据本身,所以上面的代码就不难理解我们只是在data列表中存了5个buff的内存地址,而且这5个内存地址是指向同一个数据的,当运行到最后一个循环的时候buff里面的数据就变为{'d':4},所以data最后的结果就是5个相同的内容。

弄清楚了上面的问题,我们可以做以下更改来实现我们的目的

data = []buff = dict()for i in range(5):    buff['d'] = i    data.append(buff)    buff = dict()print(data)

最终的结果如下

[{'d':0},{'d':1},{'d':2},{'d':3},{'d':4}],

因为我们在append之后相当于新建了一个空字典,buff不再指向之前的内存地址了,在下次循环的时候会将数据存档在新的内存空间里面,而列表中其实是存了5个不同的内存地址。

总结:

列表并不是直接存放数据对象本身,而是存放数据对象的内存地址,如果内存地址对应的内容被修改了那么列表也会被更改掉。

转载于:https://www.cnblogs.com/FanMLei/p/10501024.html

你可能感兴趣的文章
IBM公司公布三层单元PCM-MLC,向3DX堆栈方案发起挑战
查看>>
《2040大预言:高科技引擎与社会新秩序》—— 导读
查看>>
数据库操作:添加、插入、更新语句
查看>>
降低数据中心能源消耗
查看>>
《Python Cookbook(第3版)中文版》——1.8 与字典有关的计算问题
查看>>
《提高转化率!网页A/B测试与多变量测试实战指南》一2.5 勇气与责任心
查看>>
深入实践Spring Boot3.2 控制器设计
查看>>
《微信小程序:开发入门及案例详解》—— 导读
查看>>
降低JRuby的内存占用的可能方法
查看>>
如何创建和使用Python CGI脚本
查看>>
RHCSA 系列(九): 安装、配置及加固一个 Web 和 FTP 服务器
查看>>
《jQuery、jQuery UI及jQuery Mobile技巧与示例》——3.7 示例:添加函数的返回结果...
查看>>
并发集合(一)引言
查看>>
如何写gdb命令脚本
查看>>
Android ListView展示不同的布局
查看>>
oracle 表(下)
查看>>
iOS宏(自己使用,持续更新)
查看>>
手把手玩转win8开发系列课程(3)
查看>>
NGINX引入线程池 性能提升9倍
查看>>
《淘宝技术这十年》读书笔记 (四). 分布式时代和中间件
查看>>