zoukankan      html  css  js  c++  java
  • 列表中的陷阱

    列表是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!
  • 相关阅读:
    开发3dMax插件的方法和应用
    实现X*N
    fork与vfork的区别
    使用递归算法写一段程序
    宏和函数的区别
    多线程学习(一)
    [算法天天练]堆排序
    [转][算法天天练]堆与堆排序
    [转]快速排序 挖坑讲解方法
    [算法天天练]选择排序法
  • 原文地址:https://www.cnblogs.com/FanMLei/p/10501024.html
Copyright © 2011-2022 走看看