在網上看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上面**可以看出,整型1,2在記憶體中有自己的位址,把他們賦值給變數的時候,就是把自己的位址引用給了變數。23044812
23044824
23044812
23044812
[finished in 0.1s]
現在來解釋上面的**:
列表[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。問題主要是這樣的,客戶端做乙個介面,介面上面有三個框,主要是將候選字拖到裡面,那麼在服務端每個人都對應這樣乙個框,也就是需要...