Python中l(wèi)ist列表的賦值方法及遇到問題處理
問題起源:
本文的原因是因?yàn)樵谑褂胠ist的直接賦值b=a時(shí),得到的結(jié)果與預(yù)期不同,后來才發(fā)現(xiàn)直接使用等于號(hào)=對列表進(jìn)行賦值會(huì)產(chǎn)生一系列的問題,于是將賦值、淺拷貝、深拷貝三者之間的區(qū)別進(jìn)行記錄。
1.列表list賦值方法
在python中,對象的賦值就是簡單的對象引用,這點(diǎn)和C++是不同的,
如下例子所示:
a = ['a', 'b', 'c'] b = a ? # 采用簡單的=賦值 print(a==b) # 下面是輸出結(jié)果: True
上面這種情況下,b和a是一樣的,他們指向同一片內(nèi)存,b不過是a的別名,是引用。我們可以使用a與b是否相同來判斷,返回True
,表明他們地址相同,內(nèi)容相同。
賦值操作(包括對象作為參數(shù)、返回值)不會(huì)開辟新的內(nèi)存空間,它只是復(fù)制了新對象的引用。也就是說,除了b這個(gè)名字以外,沒有其它的內(nèi)存開銷。
修改了a,就影響了b;同理,修改了b就影響了a。下面的例子嘗試對b進(jìn)行修改,在后面加入新的元素’d’,通過觀察輸出結(jié)果發(fā)現(xiàn):在修改列表b的同時(shí),列表a也會(huì)被修改,因?yàn)閮烧哂玫氖峭粋€(gè)內(nèi)存空間。
a = ['a', 'b', 'c'] b = a b.append('d') print('a = {}'.format(a)) print('b = {}'.format(b)) # 下面是輸出結(jié)果: a = ['a', 'b', 'c', 'd'] b = ['a', 'b', 'c', 'd']
2.淺拷貝(shallow copy)
淺拷貝會(huì)創(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) #使用時(shí)要import copy模塊
淺拷貝產(chǎn)生的b不再是a了,使用is可以發(fā)現(xiàn)他們不是同一個(gè)對象,使用id查看,發(fā)現(xiàn)它們也不指向同一片內(nèi)存。但是當(dāng)我們使用 id(x) for x in a 和 id(x) for x in b 時(shí),可以看到二者包含的元素的地址是相同的。
在這種情況下,a和b是不同的對象,修改b理論上不會(huì)影響a。比如b.append([4,5])。
代碼效果如下:
a = ['a', 'b', 'c', ['yellow', 'red']] b = a[:] ?# 采用了切片操作對列表b進(jìn)行賦值 b.append('green') # 對列表b執(zhí)行添加元素操作 print('a = {}'.format(a)) print('b = {}'.format(b)) # 下面是輸出結(jié)果: a = ['a', 'b', 'c', ['yellow', 'red']] ?# a中的元素不發(fā)生變化 b = ['a', 'b', 'c', ['yellow', 'red'], 'green'] ?# b中增加了一個(gè)元素'green'
但是要注意:淺拷貝之所以稱為淺拷貝,是它僅僅只拷貝了一層,在a中有一個(gè)嵌套的list,如果我們修改了它,情況就不一樣了。
a[3].append(“blue”)。查看b,你將發(fā)現(xiàn)b也發(fā)生了變化。這是因?yàn)椋阈薷牧饲短椎膌ist。修改外層元素,會(huì)修改它的引用,讓它們指向別的位置,修改嵌套列表中的元素,列表的地址并為發(fā)生變化,指向的都是同一個(gè)位置。
代碼如下:
a = ['a', 'b', 'c', ['yellow', 'red']] b = a[:] ?# 采用了切片操作對列表b進(jìn)行賦值 a[3].append('blue') ?# 在a列表中的第3個(gè)元素中增加元素'blue',由于a[3]本身也是一個(gè)列表,從而是在列表后增加了元素'blue',從輸出結(jié)果中可以看出來。 print('a = {}'.format(a)) print('b = {}'.format(b)) # 下面是輸出結(jié)果: a = ['a', 'b', 'c', ['yellow', 'red', 'blue']] b = ['a', 'b', 'c', ['yellow', 'red', 'blue']]
3.深拷貝
深拷貝只有一種形式,copy
模塊中的deepcopy
函數(shù)。
和淺拷貝對應(yīng),深拷貝拷貝了對象的所有元素,包括多層嵌套的元素。因而,它的時(shí)間和空間開銷要高。
同樣對la,若使用b = copy.deepcopy(a)
,再修改b將不會(huì)影響到a了。即使嵌套的列表具有更深的層次,也不會(huì)產(chǎn)生任何影響,因?yàn)樯羁截惓鰜淼膶ο蟾揪褪且粋€(gè)全新的對象,不再與原來的對象有任何關(guān)聯(lián)。
實(shí)例代碼如下:
import copy a = ['a', 'b', 'c', ['yellow', 'red']] b = copy.deepcopy(a) ? # 采用深拷貝對a進(jìn)行深拷貝操作 b.append('xyz') print('a = {}'.format(a)) print('b = {}'.format(b)) # 下面是輸出結(jié)果: a = ['a', 'b', 'c', ['yellow', 'red']] ? # 使用深拷貝,對b的修改不會(huì)影響到a b = ['a', 'b', 'c', ['yellow', 'red'], 'xyz']
或者用下面的代碼:
import copy a = ['a', 'b', 'c', ['yellow', 'red']] b = copy.deepcopy(a) ? # 采用深拷貝對a進(jìn)行深拷貝操作 a[3].append('crazy') print('a = {}'.format(a)) print('b = {}'.format(b)) # 下面是輸出結(jié)果: a = ['a', 'b', 'c', ['yellow', 'red', 'crazy']] ? b = ['a', 'b', 'c', ['yellow', 'red']] ? # 對a的修改不會(huì)影響到b
或者用下面的代碼:
import copy a = ['a', 'b', 'c', ['yellow', 'red']] b = copy.deepcopy(a) ? # 采用深拷貝對a進(jìn)行深拷貝操作 a[3].append('crazy') b.append('dddd') print('a = {}'.format(a)) print('b = {}'.format(b)) # 下面是輸出結(jié)果: a = ['a', 'b', 'c', ['yellow', 'red', 'crazy']] b = ['a', 'b', 'c', ['yellow', 'red'], 'dddd']
4.關(guān)于拷貝操作的提醒
- 1、對于非容器類型,如數(shù)字,字符,以及其它“原子”類型,沒有拷貝一說。產(chǎn)生的都是原對象的引用。
- 2、如果元組變量值包含原子類型對象,即使采用了深拷貝,也只能得到淺拷貝。
到此這篇關(guān)于Python中list
列表的賦值方法及遇到問題處理的文章就介紹到這了,更多相關(guān)list列表賦值方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對Python 2.7 pandas 中的read_excel詳解
今天小編就為大家分享一篇對Python 2.7 pandas 中的read_excel詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05基于pytorch實(shí)現(xiàn)對圖片進(jìn)行數(shù)據(jù)增強(qiáng)
圖像數(shù)據(jù)增強(qiáng)是一種在訓(xùn)練機(jī)器學(xué)習(xí)和深度學(xué)習(xí)模型時(shí)常用的策略,尤其是在計(jì)算機(jī)視覺領(lǐng)域,具體而言,它通過創(chuàng)建和原始圖像稍有不同的新圖像來擴(kuò)大訓(xùn)練集,本文給大家介紹了如何基于pytorch實(shí)現(xiàn)對圖片進(jìn)行數(shù)據(jù)增強(qiáng),需要的朋友可以參考下2024-01-01詳解使用Pytorch Geometric實(shí)現(xiàn)GraphSAGE模型
這篇文章主要為大家介紹了詳解使用Pytorch Geometric實(shí)現(xiàn)GraphSAGE模型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04python自動(dòng)發(fā)郵件總結(jié)及實(shí)例說明【推薦】
python發(fā)郵件需要掌握兩個(gè)模塊的用法,smtplib和email,這倆模塊是python自帶的,只需import即可使用。這篇文章主要介紹了python自動(dòng)發(fā)郵件總結(jié)及實(shí)例說明 ,需要的朋友可以參考下2019-05-05python 讀txt文件,按‘,’分割每行數(shù)據(jù)操作
這篇文章主要介紹了python 讀txt文件,按‘,’分割每行數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07Python爬蟲實(shí)現(xiàn)爬取下載網(wǎng)站數(shù)據(jù)的幾種方法示例
這篇文章主要為大家介紹了Python爬蟲實(shí)現(xiàn)爬取下載網(wǎng)站數(shù)據(jù)的幾種方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11python求平均數(shù)、方差、中位數(shù)的例子
今天小編就為大家分享一篇python求平均數(shù)、方差、中位數(shù)的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08