1. 程式人生 > >python中是按值傳遞引數還是按引用傳遞引數

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中,函式傳參,還是傳入的引用,而不是值。。

對於不可以改變和可以改變的資料型別,在函式呼叫的時候,會有不同的處理方式。。

======

知識總結尚淺,需要更多的學習,以後繼續更新。。。