python 值传递还是引用传递_python函数是值传递还是引用传递
在網(wǎng)上看python的基礎(chǔ)知識(shí),看到函數(shù)這一章的時(shí)候,看到這么一段話:
所有參數(shù)(自變量)在Python里都是按引用傳遞。如果你在函數(shù)里修改了參數(shù),那么在調(diào)用這個(gè)函數(shù)的函數(shù)里,原始的參數(shù)也被改變了。
def changeme( mylist ):
"修改傳入的列表"
mylist.append([1,2,3,4]);
print "函數(shù)內(nèi)取值: ", mylist
return
list1 = [10,20,30];
changeme( list1 );
print "函數(shù)外取值: ",list1
運(yùn)行結(jié)果:
函數(shù)內(nèi)取值: [10, 20, 30, [1, 2, 3, 4]]
函數(shù)外取值: [10, 20, 30, [1, 2, 3, 4]]
[Finished in 0.2s]
感覺(jué)好像真的是引用傳遞,于是乎自己寫了點(diǎn)代碼驗(yàn)證:
def changeA(a):
a = 10
num = 2
changeA(num)
print num
打印出的結(jié)果卻是 “2”。。。。蒙圈了!。。。說(shuō)好的引用傳遞呢。
網(wǎng)上搜索了一番,發(fā)現(xiàn)很多人是這么說(shuō)的:
不可變類型引用傳遞,可變類型值傳遞。
原來(lái)是這樣,但啥是可變類型,不可變類型,又在網(wǎng)上搜索了一下:
在python中,strings, tuples, 和numbers是不可更改的對(duì)象,而list,dict等則是可以修改的對(duì)象
這樣好像可以解釋上面的代碼了,但是個(gè)人覺(jué)得傳對(duì)象引用(對(duì)象傳遞)更好理解
在python中,變量就是一個(gè)變量,沒(méi)有類型可言,我們可以給一個(gè)變量賦各種類型的值
a=2
a="test"
a=[2,3,3]
而類型是屬于對(duì)象,一個(gè)類型具體的值在內(nèi)存中都一個(gè)地址,改變變量的值其實(shí)是改變了它引用的地址
print id(1)
print id(2)
a=1
print id(a)
a=2
c=2
print id(a)
print id(c)
運(yùn)行結(jié)果:
23044824
23044812
23044824
23044812
23044812
[Finished in 0.1s]
上面代碼可以看出,整型1,2在內(nèi)存中有自己的地址,把他們賦值給變量的時(shí)候,就是把自己的地址引用給了變量。
現(xiàn)在來(lái)解釋上面的代碼:
列表[10,20,30]是一個(gè)對(duì)象,有自己的內(nèi)存地址,比如是:123456,變量list1用這個(gè)地址指向了這個(gè)列表。調(diào)用函數(shù)changeme的時(shí)候,這個(gè)列表對(duì)象的地址傳給了mylist,此時(shí)list1和mylist都指向了同一個(gè)列表
。mylist調(diào)用append方法,因?yàn)榱斜硎强勺冾愋?#xff08;個(gè)人理解為可以改變值,但地址不變),地址123456的列表變?yōu)閇10, 20, 30, [1, 2, 3, 4]],? 所以list1的值也是[10, 20, 30, [1, 2, 3, 4]]。
第二段代碼,num=2, 2也是一個(gè)對(duì)象,假如2在內(nèi)存的地址是:54321,此時(shí)變量num的地址是:54321。調(diào)用函數(shù)changeA,此時(shí)變量a的地址也是54321,此時(shí)a=2,接著a=10,因?yàn)閿?shù)字類型是不可變類型,2不能直接變?yōu)?0,10在內(nèi)存中是另外一個(gè)地址,比如54330。上面說(shuō)過(guò)改變變量的值其實(shí)是改變引用的地址,因此當(dāng)a=10執(zhí)行完后,變量a的地址是54300,而num的地址依然是54321,其值也就是2
再附上個(gè)鏈接參考一下:
總結(jié)
以上是生活随笔為你收集整理的python 值传递还是引用传递_python函数是值传递还是引用传递的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: app启动页数秒加载 代码_iOS 底层
- 下一篇: python怎么按键开始与停止_pyth