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中,物件賦值實際上是...