日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 值传递还是引用传递_python函数是值传递还是引用传递

發布時間:2024/9/30 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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函数是值传递还是引用传递的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。