python函式是值傳遞還是引用傳遞

2021-09-02 16:01:33 字數 1734 閱讀 6544

在網上看python的基礎知識,看到函式這一章的時候,看到這麼一段話:

所有引數(自變數)在python裡都是按引用傳遞。如果你在函式裡修改了引數,那麼在呼叫這個函式的函式裡,原始的引數也被改變了。

def changeme( mylist ):

"修改傳入的列表"

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=1print id(a)

a=2c=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都指向了同乙個列表

第二段**,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

java中函式是值傳遞還是引用傳遞?

先看乙個例子 public class test1 static void changenum int a 結果 changenum a 100 main a 10 說明對於基本的數值型別其實傳遞的是乙份數值的拷貝,傳入函式之後跟原來的值就沒有關係了,在函式中改變這個數的值也不會影響到原來的值。再看...

java中函式是值傳遞還是引用傳遞?

先看乙個例子 public class test1 static void changenum int a 結果 changenum a 100 main a 10 說明對於基本的數值型別其實傳遞的是乙份數值的拷貝,傳入函式之後跟原來的值就沒有關係了,在函式中改變這個數的值也不會影響到原來的值。再看...

Python中引數是引用傳遞,還是值傳遞

目前在使用python做開發,有乙個多月了,但是對python的引用傳遞和值傳遞,理解的不是很清楚,前幾天做乙個單子,其中將乙個引數作為初始化值傳遞給乙個介面,結果出了bug。問題主要是這樣的,客戶端做乙個介面,介面上面有三個框,主要是將候選字拖到裡面,那麼在服務端每個人都對應這樣乙個框,也就是需要...