這個(gè)問(wèn)題的答案無(wú)外乎這幾種說(shuō)法:傳值,傳引用,對(duì)于可變對(duì)象是傳引用,不可變對(duì)象是傳值。
10余年的藍(lán)山網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整藍(lán)山建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“藍(lán)山網(wǎng)站設(shè)計(jì)”,“藍(lán)山網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
傳引用
先看下面這個(gè)例子:
def foo(n):
... print id(n)
... n = 3
... print id(n)
n = 2
id(n)
31030000L
foo(n)
31030000L
31029976L
n
2
id(n)
31030000L
由foo中兩次輸出不相等可以看出,傳引用說(shuō)法并不成立。
傳值
來(lái)看下面的例子:
def foo(n):
... print n
... n.append(3)
... print n
n = [1, 2, 4, 8]
foo(n)
[1, 2, 4, 8]
[1, 2, 4, 8, 3]
n
[1, 2, 4, 8, 3]
按傳值的說(shuō)法,一個(gè)值傳進(jìn)來(lái),在函數(shù)內(nèi)改動(dòng)并不會(huì)影響變量本身的值,上面例子中n變量本身的值也被改變了,說(shuō)明傳值的說(shuō)法也不對(duì)。
3.可變對(duì)象傳引用,不可變對(duì)象傳值
相比上面兩種說(shuō)法,這種說(shuō)法似乎更靠譜,傳播也更為廣泛,那它到底對(duì)不對(duì)呢?
def foo(n):
... print id(n)
... n = ['1', '2', '3']
... print id(n)
... print n
n = [1,2,3,4,5,6]
id(n)
35637576
foo(n)
35637576
35916168
['1', '2', '3']
n
[1, 2, 3, 4, 5, 6]
按照可變對(duì)象傳引用的說(shuō)法,上面list類(lèi)型是可變對(duì)象,應(yīng)該傳引用,這foo方法中兩次調(diào)用id應(yīng)該輸出一樣的值,更改的結(jié)果也應(yīng)該影響到外部變量,但結(jié)果顯然不是這樣的,這說(shuō)明,這種說(shuō)法也是不正確的。
那么Python傳值的方法到底是什么樣呢?其實(shí)Python中的函數(shù)參數(shù)所遵循的是傳對(duì)象(call by object),或者叫做穿對(duì)象的引用(call by object reference)。在調(diào)用函數(shù)時(shí),將變量整個(gè)對(duì)象傳入,對(duì)于可變對(duì)象的修改,在函數(shù)內(nèi)外均可見(jiàn);而對(duì)于不可變對(duì)象,因?yàn)槠洳⒉荒苷嬲饬x上被賦值,修改是通過(guò)生成新的對(duì)象來(lái)實(shí)現(xiàn)的。
下面來(lái)一個(gè)有趣的例子作為結(jié)尾:
def bar(a = []):
... print id(a)
... a.append(7)
... print a
for _ in range(5):
... bar()
#結(jié)果輸出請(qǐng)自己動(dòng)手實(shí)踐,原因應(yīng)該不難理解
那要看數(shù)據(jù)類(lèi)型了,int,float,str這種就是傳值,list,dict,類(lèi)的實(shí)例,自定義對(duì)象都是穿引用。
下面是示例代碼:
def?change(int1,float1,str1,dict1,obj1,list1):
int1+=1
float1+=1
str1+='changed'
dict1['none_exist_key']='none_exist_value'
obj1=None
list1.append('change')
class?obj:
pass
int1=0
float1=0.0
str1='origin'
dict1={'key':'value'}
obj1=obj()
list1=['only_element']
print(int1)
print(float1)
print(str1)
print(dict1)
print(obj1)
print(list1)
change(int1,float1,str1,dict1,obj1,list1)
print('after?change')
print(int1)
print(float1)
print(str1)
print(dict1)
print(obj1)
print(list1)
不明白可追問(wèn)
python的一切數(shù)據(jù)類(lèi)型都是對(duì)象。但是python的對(duì)象分為不可變對(duì)象和可變對(duì)象。python的變量是引用,對(duì)python變量的賦值是引用去綁定該對(duì)象。
可變對(duì)象的數(shù)據(jù)發(fā)生改變,例如列表和字典,引用不會(huì)更改綁定對(duì)象,畢竟本身就是用于增刪改查的,頻繁地產(chǎn)生新對(duì)象必然導(dǎo)致開(kāi)銷(xiāo)巨大,只需要該對(duì)象內(nèi)部變化就行;但對(duì)于綁定了不可變對(duì)象的引用,對(duì)象一旦改變就會(huì)使引用綁定新的對(duì)象。
這一點(diǎn)也會(huì)反應(yīng)到函數(shù)的參數(shù)上。python的傳值方式是“傳對(duì)象”引用。python的函數(shù),形參實(shí)際上是引用,實(shí)參便是對(duì)象綁定到該引用上。本質(zhì)是形參會(huì)被作為函數(shù)的局部變量,在開(kāi)辟的函數(shù)的棧內(nèi)存中被聲明。
簡(jiǎn)要來(lái)講:
如果參數(shù)是數(shù),則類(lèi)似值傳遞,
如果參數(shù)是列表和字典,則類(lèi)似引用傳遞。
每個(gè)對(duì)象都會(huì)有個(gè)id, 可以用id()驗(yàn)證以上說(shuō)法:
這個(gè)函數(shù)的參數(shù)是列表,是可變對(duì)象。
首先你要明白,Python的函數(shù)傳遞方式是賦值,而賦值是通過(guò)建立變量與對(duì)象的關(guān)聯(lián)實(shí)現(xiàn)的。
對(duì)于你的代碼:
執(zhí)行 d = 2時(shí),你在__main__里創(chuàng)建了d,并讓它指向2這個(gè)整型對(duì)象。
執(zhí)行函數(shù)add(d)過(guò)程中:
d被傳遞給add()函數(shù)后,在函數(shù)內(nèi)部,num也指向了__main__中的2
但執(zhí)行num = num + 10之后,新建了對(duì)象12,并讓num指向了這個(gè)新對(duì)象——12。
如果你明白函數(shù)中的局部變量與__main__中變量的區(qū)別,那么很顯然,在__main__中,d仍在指著2這個(gè)對(duì)象,它沒(méi)有改變。因此,你打印d時(shí)得到了2。
如果你想讓輸出為12,最簡(jiǎn)潔的辦法是:
在函數(shù)add()里增加return num
調(diào)用函數(shù)時(shí)使用d = add(d)
代碼如下:
def add(num):
num += 10
return num
d = 2
d = add(d)
print d
新聞標(biāo)題:python傳值函數(shù)嗎 python 類(lèi)之間傳值
網(wǎng)站URL:http://chinadenli.net/article14/doohsge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、微信小程序、、做網(wǎng)站、網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)