zoukankan      html  css  js  c++  java
  • 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}]

    好家伙原来是这么回事啊

    
    
    
  • 相关阅读:
    证明欧几里得算法的正确性
    基础练习 十六进制转换八进制
    算法训练 关联矩阵
    寻找数组中最大值
    Torry的困惑(基本型)
    最小乘积(基本型)
    矩阵乘法
    SaltStack Char02 组件
    SaltStack Char01
    Python 学习手册, char 14
  • 原文地址:https://www.cnblogs.com/BookMiki/p/10192870.html
Copyright © 2011-2022 走看看