国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-01-04 15:17:40
字體:
供稿:網(wǎng)友

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']) 

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

[0, 0, 0, 0, 0] 

這兒涉及到Python賦值到底是引用還是拷貝一份的問題,即賦值時是傳值還是傳址。上面問題是將“a”的值賦給了x出現(xiàn)了上述情況,如果是將“b”的值賦給了x,當我們修改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、直接拷貝

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

x=dict.copy() 

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

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']) 

運行結(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的列表值修改)就相互影響了,改一個,其他跟著變。看看id吧:

>>> 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)變量首次傳遞時也是引用,當需要修改靜態(tài)變量時,因為靜態(tài)變量不能改變,所以需要生成一個新的空間存儲數(shù)據(jù))。

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

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

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

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

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

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


注:相關(guān)教程知識閱讀請移步到python教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 定兴县| 都兰县| 耿马| 浦东新区| 浮山县| 磴口县| 扬中市| 长岭县| 盈江县| 山东省| 铁岭市| 冷水江市| 英吉沙县| 奉化市| 江门市| 安庆市| 犍为县| 通渭县| 青川县| 盐源县| 加查县| 武威市| 名山县| 青州市| 上高县| 阳城县| 福海县| 喀喇沁旗| 天水市| 屯昌县| 定远县| 荣成市| 迁西县| 双柏县| 阿荣旗| 紫阳县| 淮滨县| 瑞安市| 偏关县| 海原县| 临邑县|