列表中的陷阱
列表是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个不同的内存地址。
总结:
列表并不是直接存放数据对象本身,而是存放数据对象的内存地址,如果内存地址对应的内容被修改了那么列表也会被更改掉。
努力成为一名GEEK!