本文目錄一覽:
Python 的函數是怎麼傳遞參數的
對象vs變量
在python中,類型屬於對象,變量是沒有類型的,這正是python的語言特性,也是吸引着很多pythoner的一點。所有的變量都可以理解是內存中一個對象的“引用”,或者,也可以看似c中void*的感覺。所以,希望大家在看到一個python變量的時候,把變量和真正的內存對象分開。
類型是屬於對象的,而不是變量。
這樣,很多問題就容易思考了。
例如:
對象vs變量
12
nfoo = 1 #一個指向int數據類型的nfoo(再次提醒,nfoo沒有類型)lstFoo = [1] #一個指向list類型的lstFoo,這個list中包含一個整數1
可更改(mutable)與不可更改(immutable)對象
對應於上一個概念,就必須引出另了另一概念,這就是可更改(mutable)對象與不可更改(immutable)對象。
對於python比較熟悉的人們都應該了解這個事實,在python中,strings, tuples, 和numbers是不可更改的對象,而list,dict等則是可以修改的對象。那麼,這些所謂的可改變和不可改變影響着什麼呢?
可更改vs不可更改
12345
nfoo = 1nfoo = 2lstFoo = [1]lstFoo[0] = 2
代碼第2行中,內存中原始的1對象因為不能改變,於是被“拋棄”,另nfoo指向一個新的int對象,其值為2
代碼第5行中,更改list中第一個元素的值,因為list是可改變的,所以,第一個元素變更為2。其實應該說,lstFoo指向一個包含一個對象的數組。賦值所發生的事情,是有一個新int對象被指定給lstFoo所指向的數組對象的第一個元素,但是對於lstFoo本身來說,所指向的數組對象並沒有變化,只是數組對象的內容發生變化了。這個看似void*的變量所指向的對象仍舊是剛剛的那個有一個int對象的list。
如下圖所示:
Python的函數參數傳遞:傳值?引用?
對於變量(與對象相對的概念),其實,python函數參數傳遞可以理解為就是變量傳值操作,用C++的方式理解,就是對void*賦值。如果這個變量的值不變,我們看似就是引用,如果這個變量的值改變,我們看着像是在賦值。有點暈是吧,我們仍舊據個例子。
不可變對象參數調用
12345
def ChangeInt( a ): a = 10nfoo = 2 ChangeInt(nfoo)print nfoo #結果是2
這時發生了什麼,有一個int對象2,和指向它的變量nfoo,當傳遞給ChangeInt的時候,按照傳值的方式,複製了變量nfoo的值,這樣,a就是nfoo指向同一個Int對象了,函數中a=10的時候,發生什麼?(還記得我上面講到的那些概念么),int是不能更改的對象,於是,做了一個新的int對象,另a指向它(但是此時,被變量nfoo指向的對象,沒有發生變化),於是在外面的感覺就是函數沒有改變nfoo的值,看起來像C++中的傳值方式。
可變對象參數調用
12345
def ChangeList( a ): a[0] = 10lstFoo = [2]ChangeList(lstFoo )print nfoo #結果是[10]
當傳遞給ChangeList的時候,變量仍舊按照“傳值”的方式,複製了變量lstFoo 的值,於是a和lstFoo 指向同一個對象,但是,list是可以改變的對象,對a[0]的操作,就是對lstFoo指向的對象的內容的操作,於是,這時的a[0] = 10,就是更改了lstFoo 指向的對象的第一個元素,所以,再次輸出lstFoo 時,顯示[10],內容被改變了,看起來,像C++中的按引用傳遞。
Python 的函數是怎麼傳遞參數的?
首先你要明白,Python的函數傳遞方式是賦值,而賦值是通過建立變量與對象的關聯實現的。
對於你的代碼:
執行 d = 2時,你在__main__里創建了d,並讓它指向2這個整型對象。
執行函數add(d)過程中:
d被傳遞給add()函數後,在函數內部,num也指向了__main__中的2
但執行num = num + 10之後,新建了對象12,並讓num指向了這個新對象——12。
如果你明白函數中的局部變量與__main__中變量的區別,那麼很顯然,在__main__中,d仍在指着2這個對象,它沒有改變。因此,你打印d時得到了2。
如果你想讓輸出為12,最簡潔的辦法是:
在函數add()里增加return num
調用函數時使用d = add(d)
代碼如下:
def add(num):
num += 10
return num
d = 2
d = add(d)
print d
Python 的傳參是傳值還是傳址?
Python對可變對象(字典或列表)傳址,
對不可變對象(數字、字符或元祖)傳值。
原創文章,作者:IEMC,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/137634.html