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