欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中l(wèi)ist列表的賦值方法及遇到問(wèn)題處理

 更新時(shí)間:2022年03月07日 16:50:21   作者:我這一次  
這篇文章主要介紹了Python中l(wèi)ist列表的賦值方法及遇到問(wèn)題處理,記錄在列表list的賦值過(guò)程中遇到的問(wèn)題,并對(duì)列表的拷貝相關(guān)知識(shí)進(jìn)行匯總,需要的朋友可以參考一下

問(wèn)題起源:

本文的原因是因?yàn)樵谑褂胠ist的直接賦值b=a時(shí),得到的結(jié)果與預(yù)期不同,后來(lái)才發(fā)現(xiàn)直接使用等于號(hào)=對(duì)列表進(jìn)行賦值會(huì)產(chǎn)生一系列的問(wèn)題,于是將賦值、淺拷貝、深拷貝三者之間的區(qū)別進(jìn)行記錄。

1.列表list賦值方法

在python中,對(duì)象的賦值就是簡(jiǎn)單的對(duì)象引用,這點(diǎn)和C++是不同的,

如下例子所示:

a = ['a', 'b', 'c']
b = a ? # 采用簡(jiǎn)單的=賦值
print(a==b)

# 下面是輸出結(jié)果:
True

上面這種情況下,b和a是一樣的,他們指向同一片內(nèi)存,b不過(guò)是a的別名,是引用。我們可以使用a與b是否相同來(lái)判斷,返回True,表明他們地址相同,內(nèi)容相同。
賦值操作(包括對(duì)象作為參數(shù)、返回值)不會(huì)開(kāi)辟新的內(nèi)存空間,它只是復(fù)制了新對(duì)象的引用。也就是說(shuō),除了b這個(gè)名字以外,沒(méi)有其它的內(nèi)存開(kāi)銷。
修改了a,就影響了b;同理,修改了b就影響了a。下面的例子嘗試對(duì)b進(jìn)行修改,在后面加入新的元素’d’,通過(guò)觀察輸出結(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)建新對(duì)象,其內(nèi)容是原對(duì)象的引用。
淺拷貝有三種形式:切片操作,工廠函數(shù),copy模塊中的copy函數(shù)。

比如對(duì)上述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è)對(duì)象,使用id查看,發(fā)現(xiàn)它們也不指向同一片內(nèi)存。但是當(dāng)我們使用 id(x) for x in a 和 id(x) for x in b 時(shí),可以看到二者包含的元素的地址是相同的。
在這種情況下,a和b是不同的對(duì)象,修改b理論上不會(huì)影響a。比如b.append([4,5])。

代碼效果如下:

a = ['a', 'b', 'c', ['yellow', 'red']]
b = a[:] ?# 采用了切片操作對(duì)列表b進(jìn)行賦值
b.append('green') # 對(duì)列表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)?,你修改了嵌套的list。修改外層元素,會(huì)修改它的引用,讓它們指向別的位置,修改嵌套列表中的元素,列表的地址并為發(fā)生變化,指向的都是同一個(gè)位置。

代碼如下:

a = ['a', 'b', 'c', ['yellow', 'red']]
b = a[:] ?# 采用了切片操作對(duì)列表b進(jìn)行賦值
a[3].append('blue') ?# 在a列表中的第3個(gè)元素中增加元素'blue',由于a[3]本身也是一個(gè)列表,從而是在列表后增加了元素'blue',從輸出結(jié)果中可以看出來(lái)。
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ù)。
和淺拷貝對(duì)應(yīng),深拷貝拷貝了對(duì)象的所有元素,包括多層嵌套的元素。因而,它的時(shí)間和空間開(kāi)銷要高。
同樣對(duì)la,若使用b = copy.deepcopy(a),再修改b將不會(huì)影響到a了。即使嵌套的列表具有更深的層次,也不會(huì)產(chǎn)生任何影響,因?yàn)樯羁截惓鰜?lái)的對(duì)象根本就是一個(gè)全新的對(duì)象,不再與原來(lái)的對(duì)象有任何關(guān)聯(lián)。

實(shí)例代碼如下:

import copy
a = ['a', 'b', 'c', ['yellow', 'red']]
b = copy.deepcopy(a) ? # 采用深拷貝對(duì)a進(jìn)行深拷貝操作
b.append('xyz')
print('a = {}'.format(a))
print('b = {}'.format(b))

# 下面是輸出結(jié)果:
a = ['a', 'b', 'c', ['yellow', 'red']] ? # 使用深拷貝,對(duì)b的修改不會(huì)影響到a
b = ['a', 'b', 'c', ['yellow', 'red'], 'xyz']

或者用下面的代碼:

import copy
a = ['a', 'b', 'c', ['yellow', 'red']]
b = copy.deepcopy(a) ? # 采用深拷貝對(duì)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']] ? # 對(duì)a的修改不會(huì)影響到b

或者用下面的代碼:

import copy
a = ['a', 'b', 'c', ['yellow', 'red']]
b = copy.deepcopy(a) ? # 采用深拷貝對(duì)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、對(duì)于非容器類型,如數(shù)字,字符,以及其它“原子”類型,沒(méi)有拷貝一說(shuō)。產(chǎn)生的都是原對(duì)象的引用。
  • 2、如果元組變量值包含原子類型對(duì)象,即使采用了深拷貝,也只能得到淺拷貝。

到此這篇關(guān)于Python中list列表的賦值方法及遇到問(wèn)題處理的文章就介紹到這了,更多相關(guān)list列表賦值方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 對(duì)Python 2.7 pandas 中的read_excel詳解

    對(duì)Python 2.7 pandas 中的read_excel詳解

    今天小編就為大家分享一篇對(duì)Python 2.7 pandas 中的read_excel詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 基于pytorch實(shí)現(xiàn)對(duì)圖片進(jìn)行數(shù)據(jù)增強(qiáng)

    基于pytorch實(shí)現(xiàn)對(duì)圖片進(jìn)行數(shù)據(jù)增強(qiáng)

    圖像數(shù)據(jù)增強(qiáng)是一種在訓(xùn)練機(jī)器學(xué)習(xí)和深度學(xué)習(xí)模型時(shí)常用的策略,尤其是在計(jì)算機(jī)視覺(jué)領(lǐng)域,具體而言,它通過(guò)創(chuàng)建和原始圖像稍有不同的新圖像來(lái)擴(kuò)大訓(xùn)練集,本文給大家介紹了如何基于pytorch實(shí)現(xiàn)對(duì)圖片進(jìn)行數(shù)據(jù)增強(qiáng),需要的朋友可以參考下
    2024-01-01
  • 詳解使用Pytorch Geometric實(shí)現(xiàn)GraphSAGE模型

    詳解使用Pytorch Geometric實(shí)現(xiàn)GraphSAGE模型

    這篇文章主要為大家介紹了詳解使用Pytorch Geometric實(shí)現(xiàn)GraphSAGE模型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 安裝Anaconda3及使用Jupyter的方法

    安裝Anaconda3及使用Jupyter的方法

    這篇文章主要介紹了安裝Anaconda3及使用Jupyter的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • python自動(dòng)發(fā)郵件總結(jié)及實(shí)例說(shuō)明【推薦】

    python自動(dòng)發(fā)郵件總結(jié)及實(shí)例說(shuō)明【推薦】

    python發(fā)郵件需要掌握兩個(gè)模塊的用法,smtplib和email,這倆模塊是python自帶的,只需import即可使用。這篇文章主要介紹了python自動(dòng)發(fā)郵件總結(jié)及實(shí)例說(shuō)明 ,需要的朋友可以參考下
    2019-05-05
  • python 讀txt文件,按‘,’分割每行數(shù)據(jù)操作

    python 讀txt文件,按‘,’分割每行數(shù)據(jù)操作

    這篇文章主要介紹了python 讀txt文件,按‘,’分割每行數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • python字符串中的單雙引

    python字符串中的單雙引

    下面小編就為大家?guī)?lái)一篇python字符串中的單雙引。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • python之MSE、MAE、RMSE的使用

    python之MSE、MAE、RMSE的使用

    今天小編就為大家分享一篇python之MSE、MAE、RMSE的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • Python爬蟲(chóng)實(shí)現(xiàn)爬取下載網(wǎng)站數(shù)據(jù)的幾種方法示例

    Python爬蟲(chóng)實(shí)現(xiàn)爬取下載網(wǎng)站數(shù)據(jù)的幾種方法示例

    這篇文章主要為大家介紹了Python爬蟲(chóng)實(shí)現(xiàn)爬取下載網(wǎng)站數(shù)據(jù)的幾種方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • python求平均數(shù)、方差、中位數(shù)的例子

    python求平均數(shù)、方差、中位數(shù)的例子

    今天小編就為大家分享一篇python求平均數(shù)、方差、中位數(shù)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08

最新評(píng)論