Python列表賦值 淺copy 深copy的區別

2021-10-22 18:28:55 字數 2131 閱讀 9481

1.python中列表的賦值操作

賦值操作在其他語言裡也很常見,例:

name1 = ['centos',123123,'fedora','freebsd',['uos','deepin','flag']]

name2 = name1

這是python中列表的賦值方式,經過列印後列表name2和列表name1是一樣的

['centos', 123123, 'fedora', 'freebsd', ['uos', 'deepin', 'flag']]

['centos', 123123, 'fedora', 'freebsd', ['uos', 'deepin', 'flag']]

但是我們應該更加關係賦值背後的原理:

可以看到name2 和  name1 都指向同一塊記憶體中的位址 ,無論是改變  name1中的元素 還是更改name2中任何一級元素 ,其結果都會同步(影響)到另乙個列表。這裡的 centos   123123    fedora  freebsd 為列表儲存結構中的第一級, uos   deepin   flag   為列表儲存結構中的第二級

如果使用id()函式來檢視的話,兩個列表在記憶體中的位址也是相同的

print(id(name1))

print(id(name2))

2330987572424

2330987572424

2. python中列表的淺copy

原理指向圖:

這次以name3 和  name4為例 

可以看到當我們使用了淺copy後name4會複製name3的第一級結構到乙個新的位址,但是後面的第二級結構仍然指向原來的記憶體區間。這樣一來產生的效果就是:如果我們修改name4的第一級列表,那麼產生的修改將不會影響到name3的第一級列表;如果通過修改name4的第二級列表,那麼會影響到name3的第二級列表

修改name4的第一級:

name3 = ['centos',123123,'fedora','freebsd',['uos','deepin','flag']]

name4 = name3.copy()

name4[0] = 'redhat'

print(name3)

print(name4)

執行結果為:

['centos', 123123, 'fedora', 'freebsd', ['uos', 'deepin', 'flag']]

['redhat', 123123, 'fedora', 'freebsd', ['uos', 'deepin', 'flag']]

修改儲存結構的第二級:

name3 = ['centos',123123,'fedora','freebsd',['uos','deepin','flag']]

name4 = name3.copy()

name4[4][0] = 'debian'

print(name3)

print(name4)

執行結果:

['centos', 123123, 'fedora', 'freebsd', ['debian', 'deepin', 'flag']]

['centos', 123123, 'fedora', 'freebsd', ['debian', 'deepin', 'flag']]

3. python列表的深copy

先看實現原理:

deepcopy是將原來的列表的(不管有多少級)遞迴的複製出來到乙個新的記憶體區間,無論我們怎麼修改deepcopy的列表都不會對原始列表產生任何影響

Python賦值 深淺copy

在 python 中,物件的賦值就是簡單的物件引用,這點和 c 不同,如下所示 a 1,2,hello python c b a在上述情況下,a 和 b 是一樣的,他們指向同一片記憶體,b 不過是 a 的別名,是引用.我們可以使用 b is a 去判斷,返回 true,表明他們位址相同,內容相同,也...

Python 列表賦值 淺拷貝 深拷貝 02

關於python中列表 字典的深淺拷貝問題之前認識比較模糊,之前的筆記中其實只是區分了拷貝和賦值的問題,今天以列表為例重新學習一下 關於深淺拷貝和賦值的概念 a.直接賦值 用等號 其實就是物件的引用 b.淺拷貝 用copy 拷貝父物件,但是不會拷貝內部子物件 c.深度拷貝 用deepcopy,是採用...

python深淺copy和賦值

基於引用和物件 python引用和物件分離 直接賦值 a b a,b兩個引用指向相同的物件 淺copy a為b的copy copy 新建 b的不可變子物件,共用可變子物件 深copy a為b的深copy copy 新建 b的所有子物件,兩者物件無關聯 詳細解析如下 在python中,物件賦值實際上是...