溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python中怎么引用傳遞變量賦值

發(fā)布時間:2021-07-29 15:19:30 來源:億速云 閱讀:167 作者:Leah 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)Python中怎么引用傳遞變量賦值,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

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

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

  x=dict['a']

  foriinrange(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)行任意修改都不會影響其他變量。還是上面的代碼,如果改成如下:

  importcopy

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

  x=copy.deepcopy(dict['a'])

  foriinrange(5):

  x[i]=0

  print(dict['a'])

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

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

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

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

2、傳遞規(guī)則

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

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

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

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

  >>>a=6

  >>>id(a)

  10413476

  >>>b=a

  >>>id(b)

  10413476

  >>>b=8

  >>>id(b)

  10413452

  >>>

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

關(guān)于Python中怎么引用傳遞變量賦值就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI