1.傳值和傳址的區(qū)別
傳值就是傳入一個參數(shù)的值,傳址就是傳入一個參數(shù)的地址,也就是內(nèi)存的地址(相當于指針)。他們的區(qū)別是如果函數(shù)里面對傳入的參數(shù)重新賦值,函數(shù)外的全局變量是否相應改變,用傳值傳入的參數(shù)是不會改變的,用傳址傳入就會改變。
a=1
def f(b):
b=2
f(a)
print (a)
例如這段代碼里面,首先聲明a的值為1,把a作為參數(shù)傳入到函數(shù)f里面,函數(shù)f里面對b重新賦值為2,如果是傳值的形式傳入a的話,a的值是不會變的,依然為1,如果以傳址的形式(但是這個不是程序員能決定的)傳入a,a就會變成2。這個就是傳值和傳址的區(qū)別。
2. Python中的傳址和傳值是怎樣的呢?
Python是不允許程序員選擇采用傳值還是傳址的。Python參數(shù)傳遞采用的肯定是“傳對象引用”的方式。實際上,這種方式相當于傳值和傳址的一種綜合。
如果函數(shù)收到的是一個可變對象(比如字典或者列表)的引用,就能修改對象的原始值——相當于傳址。如果函數(shù)收到的是一個不可變對象(比如數(shù)字、字符或者元組)的引用(其實也是對象地址?。。。?,就不能直接修改原始對象——相當于傳值。
所以python的傳值和傳址是根據(jù)傳入?yún)?shù)的類型來選擇的
傳值的參數(shù)類型:數(shù)字,字符串,元組(immutable)
傳址的參數(shù)類型:列表,字典(mutable)
a=1
def f(a):
a+=1
f(a)
print (a)
這段代碼里面,因為a是數(shù)字類型,所以是傳值的方式,a的值并不會變,輸出為1
a=[1]
def f(a):
a[0]+=1
f(a)
print (a)
這段代碼里面,因為a的類型是列表,所以是傳址的形式,a[0]的值會改變,輸出為[2]
3. copy和deepcopy
不止是函數(shù)里面,函數(shù)外面的引用也同樣遵循這個規(guī)則:
import copy
a=[1,2,3]
b=a
a.append(4)
print a,b
a=[1,2,3]
b=copy.copy(a)
a.append(4)
print (a,b)
第一個輸出為2,1,第二個輸出為 [2] [2]
b=a
所以在python中,當運行上面的代碼時,如果a是字典或者列表的話,程序執(zhí)行的操作并不是新建一個b變量,然后a的值復制給b,而是新建一個b變量,把b的值指向a,也就是相當于在c語言里面的新建一個指向a的指針。
所以當a的值發(fā)生改變時,b的值會相應改變。
但是,當我們想新建一個與a的值相等的b變量,同時b的值與a的值沒有關聯(lián)時,要怎么做?這時就用到copy與deepcopy了
import copy
a=[1,2,3]
b=a
a.append(4)
print (a,b)
a=[1,2,3]
b=copy.copy(a)
a.append(4)
print (a,b)
上面的輸出為:
[1, 2, 3, 4] [1, 2, 3, 4]
[1, 2, 3, 4] [1, 2, 3]
這里用了copy來讓b與a相等,后面如果修改了a的值,b的值并不會改變。看來copy已經(jīng)可以實現(xiàn)我們上面的提到的需求了,那么deepcopy又有什么用?
如果我們遇到這種情況,copy就解決不了了
a=[1,[1,2],3]
b=copy.copy(a)
a[1].append(4)
print(a,b)
這里輸出的結(jié)果為:[1, [1, 2, 4], 3] [1, [1, 2, 4], 3] ,這樣的結(jié)果明顯不是我們想要的
當列表或字典參數(shù)里面的值是列表或字典時,copy并不會復制參數(shù)里面的列表或字典,這時就要用到deepcopy了文章來源:http://www.zghlxwxcb.cn/news/detail-749642.html
#學習中遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流群:711312441
a=[1,[1,2],3]
b=copy.deepcopy(a)
a[1].append(4)
print (a,b)
輸出的結(jié)果為:[1, [1, 2, 4], 3] [1, [1, 2], 3]文章來源地址http://www.zghlxwxcb.cn/news/detail-749642.html
到了這里,關于python中函數(shù)參數(shù)引用之傳值/傳址和copy/deepcopy的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!