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

Python中實(shí)現(xiàn)變量賦值傳遞時的引用和拷貝方法

 更新時間:2018年04月29日 10:49:48   作者:宋哥  
下面小編就為大家分享一篇Python中實(shí)現(xiàn)變量賦值傳遞時的引用和拷貝方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

iamlaosong文

曾經(jīng)看到這樣一個問題,一個字典中的元素是列表,將這個列表元素賦值給一個變量,然后修改這個列表中元素的值,結(jié)果發(fā)現(xiàn),字典中那個列表也同樣修改了。

那個問題如下:

dict = {'a':[1,2,3,4,5],'b':2} 
x = dict['a'] 
for i in range(5): 
  x[i] = 0 
print(dict['a']) 

程序運(yùn)行結(jié)果如下:

[0, 0, 0, 0, 0] 

這兒涉及到Python賦值到底是引用還是拷貝一份的問題,即賦值時是傳值還是傳址。上面問題是將“a”的值賦給了x出現(xiàn)了上述情況,如果是將“b”的值賦給了x,當(dāng)我們修改x的值時,字典dict的值并不受影響。

>>> dict = {'a':[1,2,3,4,5],'b':2} 
>>> x = dict['b'] 
>>> x 
2 
>>> x=x+3 
>>> x 
5 
>>> dict 
{'a': [1, 2, 3, 4, 5], 'b': 2} 
>>>  

那么問題來了,變量賦值傳遞時什么情況下是傳值(拷貝),什么情況下是傳址(引用)呢?

1、直接拷貝

當(dāng)我們不知道是引用還是拷貝的情況下,可以顯式的拷貝。比如字典對象本身都具有拷貝的方法:

x=dict.copy() 

沒有拷貝方法的對象,也是可以拷貝的。這兒我們引入一個深拷貝的概念,深拷貝——即python的copy模塊提供的一個deepcopy方法。深拷貝會完全復(fù)制原變量相關(guān)的所有數(shù)據(jù),在內(nèi)存中生成一套完全一樣的內(nèi)容,在這個過程中我們對這兩個變量中的一個進(jìn)行任意修改都不會影響其他變量。還是上面的代碼,如果改成如下:

import copy 
dict = {'a':[1,2,3,4,5],'b':2} 
x = copy.deepcopy(dict['a']) 
for i in range(5): 
  x[i] = 0 
print(dict['a']) 

運(yùn)行結(jié)果dict值不受影響。

除了深拷貝,copy模塊還提供一個copy方法,稱其為淺拷貝,對于簡單的對象,深淺拷貝都是一樣的,上面的詞典對象的copy方法就是淺拷貝。

>>> dict
{'a': [8, 2, 3, 4, 5], 'b': 4}
>>> dd=copy.copy(dict)
>>> dd
{'a': [8, 2, 3, 4, 5], 'b': 4}
>>> dd['a'][0]=7
>>> dd
{'a': [7, 2, 3, 4, 5], 'b': 4}
>>> dict
{'a': [7, 2, 3, 4, 5], 'b': 4}
>>> ee=dict.copy()
>>> ee
{'a': [7, 2, 3, 4, 5], 'b': 4}
>>> ee['a'][0]=9
>>> ee
{'a': [9, 2, 3, 4, 5], 'b': 4}
>>> dict
{'a': [9, 2, 3, 4, 5], 'b': 4}
>>> ee['b']=5
>>> ee
{'a': [9, 2, 3, 4, 5], 'b': 5}
>>> dict
{'a': [9, 2, 3, 4, 5], 'b': 4}
>>> 

淺拷貝時改變第一層次相互不受影響(上例中詞典b值的修改),第二層次(上例中詞典a的列表值修改)就相互影響了,改一個,其他跟著變??纯磇d吧:

>>> id(dict) 
20109472 
>>> id(dd) 
20244496 
>>> id(ee) 
20495072 
>>> id(dd['a']) 
20272112 
>>> id(ee['a']) 
20272112 
>>> id(dict['a']) 
20272112 
>>>  

可見詞典各個拷貝的id是不同的,但詞典a值的id是相同的。如果我們需要真正意義的拷貝,就用深拷貝吧。

2、傳遞規(guī)則

Python賦值過程中不明確區(qū)分拷貝和引用,一般對靜態(tài)變量的傳遞為拷貝,對動態(tài)變量的傳遞為引用。(注,對靜態(tài)變量首次傳遞時也是引用,當(dāng)需要修改靜態(tài)變量時,因?yàn)殪o態(tài)變量不能改變,所以需要生成一個新的空間存儲數(shù)據(jù))。

字符串,數(shù)值,元組均為靜態(tài)變量

列表,字典為動態(tài)變量。

變量有時比較復(fù)雜,存在組合現(xiàn)象,比如字典中包含列表,列表中包含字典,但賦值時,總是屬于某個類型。如果實(shí)在不清楚狀況,可以試驗(yàn)一下,用id()這個函數(shù)看看,如果是引用,兩個變量指向的地址是相同的。例如:

>>> a=6 
>>> id(a) 
10413476 
>>> b=a 
>>> id(b) 
10413476 
>>> b=8 
>>> id(b) 
10413452 
>>>  

修改變量b之前,a和b指向的地址是相同的,修改b后,地址就變了。

以上這篇Python中實(shí)現(xiàn)變量賦值傳遞時的引用和拷貝方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python中的布隆過濾器用法及原理詳解

    python中的布隆過濾器用法及原理詳解

    這篇文章主要介紹了python中的布隆過濾器用法及原理詳解,布隆過濾器是一種概率空間高效的數(shù)據(jù)結(jié)構(gòu),它與hashmap非常相似,用于檢索一個元素是否在一個集合中。它在檢索元素是否存在時,能很好地取舍空間使用率與誤報(bào)比例,需要的朋友可以參考下
    2023-07-07
  • python+selenium操作下拉框

    python+selenium操作下拉框

    這篇文章主要介紹了python+selenium操作下拉框,下面文章圍繞python+selenium實(shí)現(xiàn)下拉框的相關(guān)資料展開全文章詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-02-02
  • Python全面分析系統(tǒng)的時域特性和頻率域特性

    Python全面分析系統(tǒng)的時域特性和頻率域特性

    今天小編就為大家分享一篇Python全面分析系統(tǒng)的時域特性和頻率域特性,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python爬蟲實(shí)戰(zhàn)案例之爬取喜馬拉雅音頻數(shù)據(jù)詳解

    Python爬蟲實(shí)戰(zhàn)案例之爬取喜馬拉雅音頻數(shù)據(jù)詳解

    這篇文章主要介紹了Python爬蟲實(shí)戰(zhàn)案例之取喜馬拉雅音頻數(shù)據(jù)詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Pandas時間序列基礎(chǔ)詳解(轉(zhuǎn)換,索引,切片)

    Pandas時間序列基礎(chǔ)詳解(轉(zhuǎn)換,索引,切片)

    今天小編就為大家分享一篇Pandas時間序列基礎(chǔ)詳解(轉(zhuǎn)換,索引,切片),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python包合集shutil示例代碼詳解

    python包合集shutil示例代碼詳解

    shutil是?python?中的高級文件操作模塊,與os模塊形成互補(bǔ)的關(guān)系,os主要提供了文件或文件夾的新建、刪除、查看等方法,還提供了對文件以及目錄的路徑操作,這篇文章主要介紹了python包合集-shutil,需要的朋友可以參考下
    2022-08-08
  • Python3 如何開啟自帶http服務(wù)

    Python3 如何開啟自帶http服務(wù)

    這篇文章主要介紹了Python3 開啟自帶http服務(wù)的操作方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python如何對圖片或文件的操作

    python如何對圖片或文件的操作

    在日常編程中,我們經(jīng)常會遇到文件處理的需求,如base64與圖片的相互轉(zhuǎn)換、圖片與像素點(diǎn)的操作、本地文件與二進(jìn)制的互相轉(zhuǎn)換、計(jì)算文件的md5以及下載網(wǎng)絡(luò)文件等,這些操作對于處理多媒體數(shù)據(jù)、實(shí)現(xiàn)數(shù)據(jù)的持久化存儲、保證數(shù)據(jù)的完整性和安全性等方面都至關(guān)重要
    2024-09-09
  • 使用Python獲取當(dāng)前工作目錄和執(zhí)行命令的位置

    使用Python獲取當(dāng)前工作目錄和執(zhí)行命令的位置

    這篇文章主要介紹了使用Python獲取當(dāng)前工作目錄和執(zhí)行命令的位置,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Python讀取properties配置文件操作示例

    Python讀取properties配置文件操作示例

    這篇文章主要介紹了Python讀取properties配置文件操作,結(jié)合實(shí)例形式分析了Python讀取properties配置文件操作中增加對鍵值對支持與使用的相關(guān)技巧,需要的朋友可以參考下
    2018-03-03

最新評論