在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ 不理解shallowcopy用意何在?

不理解shallowcopy用意何在?

在學(xué)deepcopy

import copy
l=[["a","b"],2,3,4,5]
s=copy.copy(l)
d=copy.deepcopy(l)
print("l:",l,id(l),"***","d:",d,id(d),"***","s:",s,id(s))
l[1]="x" #為什么這里shallow copy不跟著變呢?
print("l:",l,id(l),"***","d:",d,id(d),"***","s:",s,id(s))
l[0][0]=100 #為什么這里shallow copy跟著變呢,是不是shallow copy只更新“二級嵌套“的變化?
print("l:",l,id(l),"***","d:",d,id(d),"***","s:",s,id(s))


結(jié)果
l: [['a', 'b'], 2, 3, 4, 5] 39303688 d: [['a', 'b'], 2, 3, 4, 5] 39408072 s: [['a', 'b'], 2, 3, 4, 5] 39406984
l: [['a', 'b'], 'x', 3, 4, 5] 39303688 d: [['a', 'b'], 2, 3, 4, 5] 39408072 s: [['a', 'b'], 2, 3, 4, 5] 39406984
l: [[100, 'b'], 'x', 3, 4, 5] 39303688 d: [['a', 'b'], 2, 3, 4, 5] 39408072 s: [[100, 'b'], 2, 3, 4, 5] 39406984

我的直覺是shallow copy是原對象做了什么調(diào)整,shallow copy出的對象就做什么調(diào)整,形成一個鏡像,而deepcopy就是一個復(fù)制出來的完全獨立的,與原對象無關(guān)的對象。

實際測試不是這個樣子,感覺shallow copy 只會更新“”二級對象“”“,為什么呢?這樣設(shè)置的shallow copy 有何妙用?

回答
編輯回答
練命

1.對象的拷貝方法數(shù)字類型的是拷貝數(shù)值,其他全部是拷貝地址,你的兩個對象里面的["a","b"]內(nèi)存是一樣的,所以修改引用類型的數(shù)值,其他引用到這個的都會跟著改變.

2.python數(shù)據(jù)類型如下,包括自定義類:

Number(數(shù)字)
    int(整型)
    float(浮點型)
    complex(復(fù)數(shù))
    bool(布爾)
String(字符串)
List(列表)
Tuple(元組)
Sets(集合)
Dictionary(字典)
自定義類

3.其他的你的例子中都有,自定義類的例子如下:

    class Person:
        def __init__(self,name):
            self.name = name
        def __repr__(self):
            return self.name
    lst0 = [1,Person("小明"), 5]
    lst1 = lst0.copy()
    print(lst0 ==lst1,lst1,lst0,id(lst1),id(lst0))
    lst0[1].name="小云"
    print(lst0 ==lst1,lst1,lst0,id(lst1),id(lst0))
結(jié)果:
True [1, 小明, 5] [1, 小明, 5] 66244280 66311632
True [1, 小云, 5] [1, 小云, 5] 66244280 66311632
和你的一樣,修改引用類型會修改所有指向這個地址的對象.

4.字符串和元祖不支持修改

2017年12月10日 22:00
編輯回答
懶豬

深拷貝和淺拷貝中有一個特殊的規(guī)則,對于非容器類型(如數(shù)字、字符串、和其他'原子'類型的對象)沒有拷貝這一說
也就是說,對于這些類型,"obj is copy.copy(obj)" 、"obj is copy.deepcopy(obj)"。

詳細(xì)的可以看下這篇文章,講的很詳細(xì):
http://www.cnblogs.com/wilber...

2017年6月6日 04:19