python中是按值傳遞引數還是按引用傳遞引數
在學習python函式的時候,遇到了一個非常有趣的問題:
在函式中的引數是如何傳遞的:是傳值?還是傳引用?當然,結果我們是知道的,肯定是傳引用的。
現在,我們來測一下我們的結論:
=====
修改list,Code:
# 添加了一個string型別的元素新增到末尾
def ChangeList(lis):
lis.append('hello i am the addone')
print lis
return
is = [1, 2, 3]
ChangeList(lis)
print lis
輸出結果為:
[1, 2, 3, 'hello i am the addone']
[1,2, 3,'hello i am the addone']
由此可以知道,我們傳遞引數是傳遞的引用。。。。。。
那麼,看到別人的一個例子,我們就會覺得這裡面還是有學問的。。
那麼我們來修改一個字串,試試。
修改string,Code:
<span style="font-size:18px;">#修改字串 def ChangeString(string): string = 'i changed as this' print string return string = 'hello world' ChangeString(string) print string </span>
輸出結果為:
i changed as this
hello world
@[email protected] 說好的傳引用呢??
為什麼在函式外面輸出的時候還是hello world的呢?
原來,我們知道在python中, string型別是不能夠改變的。。
比如說我們在ChangeString中改變string的話,事實上,我們是沒有改變傳入的string的,我們僅僅作是事情是,新建一個string物件,然後把它給賦值,而已。
那如何來驗證,我們上面的這一句話呢?
修改字串again,Code:
<span style="font-size:18px;">#修改字串again,輸出string的id def ChangeString(string): string = 'i changed as this' print string, '--- id :', id(string) return string = 'hello world' ChangeString(string) print string, '--- id :', id(string) </span>
輸出結果為:
i changed as this --- id : 4353556584
hello world --- id : 4353554688
我們可以看到,他們的id是不同的,所以也就是說他們根本不是相同的物件。
也就是說,我們傳的還是引用,但是,對於不可改變的資料型別,我們不能修改。。。如果你“修改”了,事實上我們是新建一個物件來進行對待的。。
傳入的還是引用,這句話還是不錯的。
========
結論:
我們知道,在python中,函式傳參,還是傳入的引用,而不是值。。
對於不可以改變和可以改變的資料型別,在函式呼叫的時候,會有不同的處理方式。。
======
知識總結尚淺,需要更多的學習,以後繼續更新。。。