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}]

    好家伙原来是这么回事啊

    
    
    
  • 相关阅读:
    AtCoder Grand Contest 015 题解
    AtCoder Grand Contest 014 题解
    AtCoder Grand Contest 013 题解
    AtCoder Grand Contest 012 题解
    AtCoder Grand Contest 011 题解
    AtCoder Grand Contest 010 题解
    AtCoder Grand Contest 009 题解
    NOIP2017 Day2 题解
    博客园主题备份
    多项式全家桶
  • 原文地址:https://www.cnblogs.com/BookMiki/p/10192870.html
Copyright © 2011-2022 走看看