• python之深浅copy与id


    我们都知道 所谓变量就是就是在空间中开辟一块内存空间。来存放东西的

    学过c语言的都知道而数组也是有内存地址的

    我们如何来查看内存地址呢?id()这函数就来了

    x = 5
    print(id(x))

    如此一来我们就可以查看x的内存地址了他的内存地址是

    1940307088

    首先我们来看一个现象

    我们把数组赋值给一个变量a 然后在把a赋值给b 在来改变a的值 看看b 是否会发生变化呢?

    a = [1,2,3]
    b = a
    a[0] = 11
    print(b)

    得出的结果是

    [11, 2, 3]

    很显然发生了变化,这是什么原因造成的呢?最好的办法就是查一下他们的id

    print(id(a) == id(b))

    结果是 True

    很显然他们指向了同一块内存地址, 为什么会出现这种情况呢?我们在学c语言的是时候啊 知道数组的地址就是数组的首地址,所以我们可以直接赋值,

    但是内存地址没有发生改变。为了解决这一情况,我们可以采用copy的方法来将数据拷贝出来

    首先 我们import 出copy的库来

    import copy
    a = [1,2,3]
    b = copy.copy(a)
    a[0] = 11
    print(b)
    print(id(a) == id(b))

    我们看一下结果

    [1, 2, 3]
    False

    可以看出我们地址不相同了 现在改变数组里面的元素也与b无关了

    哪我们升级一下改变一下难度 我们把a 变成

    a = [1,2,[1,2,3]]

    import copy
    a = [1,2,[1,2,3]]
    b = copy.copy(a)
    a[2][0] = 11
    print(b)

    结果是

    [1, 2, [11, 2, 3]]

    我擦居然还是变了,这是怎么回事?你发现只能copy第一层 于是你不甘心你又加了字典

    import copy
    a = [1,2,[1,2,3],{'wocao':123456}]
    b = copy.copy(a)
    a[3]['wocao'] = 11
    print(b)

    结果是

    [1, 2, [1, 2, 3], {'wocao': 11}]

    于是你恍然大悟啊。。。。原来copy只能浅浅的copy一层啊!!!

    还好你上课听讲,听见了老师说了深深的copy,于是你又拿出来试试

    import copy
    a = [1,2,[1,2,3],{'wocao':123456}]
    b = copy.deepcopy(a)
    a[3]['wocao'] = 11
    a[2][1] = 11
    print(b)

    得出来

    [1, 2, [1, 2, 3], {'wocao': 123456}]

    好家伙原来是这么回事啊

    
    
    
  • 相关阅读:
    windows下安装rabbitmq
    selectors
    修改Docker默认镜像和容器的存储位置
    eclipse配置jdk的src.zip源代码步骤
    Zookeeper WINDOWS 安装配置
    zookeeper windows 入门安装和测试
    zookeeper集群搭建(windows环境下)
    ant使用指南详细入门教程
    linux查看系统版本和系统位数
    suse linux 命令
  • 原文地址:https://www.cnblogs.com/BookMiki/p/10192870.html
Copyright © 2020-2023  润新知