基于Python List的賦值方法
Python中關(guān)于對象復制有三種類型的使用方式,賦值、淺拷貝與深拷貝。他們既有區(qū)別又有聯(lián)系,剛好最近碰到這一類的問題,研究下。
一、賦值
在python中,對象的賦值就是簡單的對象引用,這點和C++不同。如下:
a = [1,2,3,"hello",["python","C++"]] b = a print a==b #True
這種情況下,b和a是一樣的,他們指向同一片內(nèi)存,b不過是a的別名,是引用。我們可以使用a與b是否相同來判斷,返回True,表明他們地址相同,內(nèi)容相同。
賦值操作(包括對象作為參數(shù)、返回值)不會開辟新的內(nèi)存空間,它只是復制了新對象的引用。也就是說,除了b這個名字以外,沒有其它的內(nèi)存開銷。
修改了a,就影響了b;同理,修改了b就影響了a。
a = [1,2,3,"hello",["python","C++"]]
b = a
b.append("ADD")
print "a=",a,"b=",b
#a=[1, 2, 3, 'hello', ['python', 'C++'], 'ADD'] b=[1, 2, 3, 'hello', ['python', 'C++'], 'ADD']
二、淺拷貝(shallow copy)
淺拷貝會創(chuàng)建新對象,其內(nèi)容是原對象的引用。
淺拷貝有三種形式:切片操作,工廠函數(shù),copy模塊中的copy函數(shù)。
比如對上述a:
1、切片操作:b = a[:] 或者 b = [each for each in a]
2、工廠函數(shù):b = list(a)
3、copy函數(shù):b = copy.copy(a)
淺拷貝產(chǎn)生的b不再是a了,使用is可以發(fā)現(xiàn)他們不是同一個對象,使用id查看,發(fā)現(xiàn)它們也不指向同一片內(nèi)存。但是當我們使用 id(x) for x in a 和 id(x) for x in b 時,可以看到二者包含的元素的地址是相同的。
在這種情況下,a和b是不同的對象,修改b理論上不會影響a。比如b.append([4,5])。
a = [1,2,3,"hello",["python","C++"]]
b = a[:]
b.append("ADD")
print "a",a,"b",b
#a [1, 2, 3, 'hello', ['python', 'C++']] b [1, 2, 3, 'hello', ['python', 'C++'], 'ADD']
但是要注意,淺拷貝之所以稱為淺拷貝,是它僅僅只拷貝了一層,在a中有一個嵌套的list,如果我們修改了它,情況就不一樣了。
a[4].append("C")。查看b,你將發(fā)現(xiàn)b也發(fā)生了變化。這是因為,你修改了嵌套的list。修改外層元素,會修改它的引用,讓它們指向別的位置,修改嵌套列表中的元素,列表的地址并為發(fā)生變化,指向的都是同一個位置。
三、深拷貝(deep copy)
深拷貝只有一種形式,copy模塊中的deepcopy函數(shù)。
和淺拷貝對應(yīng),深拷貝拷貝了對象的所有元素,包括多層嵌套的元素。因而,它的時間和空間開銷要高。
同樣對la,若使用b = copy.deepcopy(a),再修改b將不會影響到a了。即使嵌套的列表具有更深的層次,也不會產(chǎn)生任何影響,因為深拷貝出來的對象根本就是一個全新的對象,不再與原來的對象有任何關(guān)聯(lián)。
四、關(guān)于拷貝操作的警告
1、對于非容器類型,如數(shù)字,字符,以及其它“原子”類型,沒有拷貝一說。產(chǎn)生的都是原對象的引用。
2、如果元組變量值包含原子類型對象,即使采用了深拷貝,也只能得到淺拷貝。
以上這篇基于Python List的賦值方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Python快速遍歷文件夾下所有文件的方法總結(jié)
在日常的編程工作中,我們經(jīng)常會遇到需要遍歷文件夾下所有文件的情況,無論是處理大量的數(shù)據(jù)文件、進行文件系統(tǒng)的分析,還是實現(xiàn)復雜的自動化任務(wù),高效地遍歷文件夾下的所有文件都是一項非常重要的技能,在本文中,我們將深入探討如何使用 Python 快速遍歷文件夾下的所有文件2024-11-11
Pytorch torch.repeat_interleave()用法示例詳解
torch.repeat_interleave() 是 PyTorch 中的一個函數(shù),用于按指定的方式重復張量中的元素,這篇文章主要介紹了Pytorch torch.repeat_interleave()用法示例詳解,需要的朋友可以參考下2024-01-01
Python namedtuple命名元組實現(xiàn)過程解析
這篇文章主要介紹了Python namedtuple命名元組實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-01-01
Python?ORM框架之SQLAlchemy?的基礎(chǔ)用法
這篇文章主要介紹了Python?ORM框架之SQLAlchemy?的基礎(chǔ)用法,ORM全稱?Object?Relational?Mapping對象關(guān)系映射,更多詳細內(nèi)容需要的小伙伴課題參考下面文章介紹。希望對你的學習有所幫助2022-03-03
python openpyxl方法 zip函數(shù)用法及說明
這篇文章主要介紹了python openpyxl方法 zip函數(shù)用法及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
python里使用正則的findall函數(shù)的實例詳解
這篇文章主要介紹了python里使用正則的findall函數(shù)的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10

