Python引數傳遞實現過程及原理詳解

2022-09-26 21:15:20 字數 2417 閱讀 6524

在分析python的引數傳遞是如何進行的之前,我們需要先來了解一下,python變數和賦值的基本原理,這樣程式設計客棧有助於我們更好的理解引數傳遞。

python變數以及賦值

數值從幾行**開始

in [1]: a = 1

in [2]: b = a

in [3]:www.cppcns.com a = a + 1

我們先將1賦值給a,也就是a指向了1這個物件,在python中一切皆物件。接著b=a,則表示讓b也指向了1這個物件,python中乙個物件是可以被多個引用所指向。最後執行的a=a+1,這裡需要注意一點,python的資料型別中如int、str等不可變型別,執a=a+1這種操作,並不是把a指向的物件的值增加1,而是生成乙個新的物件2,並讓a指向2這個物件,原來的物件還存在於記憶體中。那這裡的話還是會被指向,我們來分別看一下a和b的值:

in [4]: a

out[4]: 2

in [5]: b

out[5]: 1

通過這個例子你可以看到,這裡的 a 和 b,開始只是兩個指向同乙個物件的變數而已,或者你也可以把它們想象成同乙個物件的兩個名字。簡單的賦值 b = a,並不表示重新建立了新物件,只是讓同乙個物件被多個變數指向或引用。同時,指向同乙個物件,也並不意味著兩個變數就被繫結到了一起。如果你給其中乙個變數重新賦值,並不會影響其他變數的值。

列表還有乙個列表的例子,再來瞅瞅:

in [6]: l1 = [3,4,5,6]

in [7]: l2 = l1

in [10]: l1.append(7)

in [11]: l1

out[11]: [3, 4, 5, 6, 7]

in [12]: l2

out[12]: [3, 4, 5, 6, 7]

**中,我們讓l1和l2這兩個變數都指向了[3,4,5,6]這個物件,我們知道列表是一種可變的資料結構,所以append操作並不會產生新的物件,只是在末尾新增了乙個元素,變成了[3, 4, 5, 6, 7],由於 l1 和 l2 同時指向這個列表,所以列表的變化會同時反映在 l1 和 l2 這兩個變數上,那麼,l1 和 l2 的值就同時變為了[3, 4, 5, 6, 7]。

物件刪除

python中變數是可以刪除的,但是物件是沒辦法刪除的

in [22]: a = [1,4,5]

in [23]: del a

del語句刪除a這個變數,就無法通過a訪問[1,4,5],但是這個物件在存在中還是存在程式設計客棧的,python的垃圾**機制發現引用為0的時候就會把它**掉。

總結python函式是如何進行引數傳遞的

python的引數傳遞是賦值傳遞或者說是引用傳遞,python裡一切皆物件,所以引數傳遞時,只是讓新變數與原變數指向了同乙個物件,下面我們來看個例子:

in [28]: def func(b):

...: b = 2

in [29]: a = 1

in [30]: func(a)

in [31]: a

out[31]: 1

這裡的引數傳遞,使變數 a 和 b 同時指向了 1 這個物件。但當我們執行到 b = 2 時,系統會重新建立乙個值為 2 的新物件,並讓 b 指向它;而 a 仍然指向 1 這個物件。所以,a 的值不變,仍然為 1。

如何改變a的值呢?

我們可以在函式中將b返回

def func(b):

b = 2

return b

a = 1

a = func(a)

a2上面的例子我們的是int型別的,下面我們看一下列表的例子:

def func(l2):

l2.append(77)

l1 = [12,3,6]

func(l1)

l1[12,3,6,77]

這裡程式設計客棧 l1 和 l2 先是同時指向值為[1, 2, 3]的列表。不過,由於列表可變,執行 append() 函式,對其末尾加入新元素 4 時,變數 l1 和 l2 的值也都隨之改變了.

那大家看一下面的例子,結果是什麼呢?

def func(l2):

l2 = l2 + [4]

l1 = [12,3,6]

func(l1)

l1[12,3,6]

可以看到,l1沒有發生變化,原因是l2 + [4]這個操作表示建立了乙個末尾加入元素 4的新列表,並讓 l2 指向這個新的物件,l1還是指向原有的物件。

總結今天,我們討論了 python 的變數及其賦值的基本原理,並且解釋了 python 中引數是如何傳遞的。和其他語言不同的是,python 中引數的傳遞既不是值傳遞,也不是引用傳遞,而是賦值傳遞,或者是叫物件的引用傳遞。需要注意的是,這裡的賦值或物件的引用傳遞,不是指向乙個具體的記憶體位址,而是指向乙個具體的物件。

本文標題: python引數傳遞實現過程及原理詳解

本文位址: /jiaoben/python/313351.html

python 引數傳遞 Python 引數傳遞

python中的變數 乙個變數是區域性還是全域性,在編譯函式的時候就已經決定,因此讀變數值的時候也不會逐層向外查詢。變數是全域性還是局域,根據如下3條 1.如果函式內部有global語句,那麼它宣告的變數是全域性的。2.如果函式內部有對變數的賦值語句,那麼它是局域的。3.除此之外都是全域性的。注意1...

python 引數傳遞 python引數傳遞

python中函式引數的傳遞是通過 賦值 來傳遞的。但這條規則只回答了函式引數傳遞的 戰略問題 並沒有回答 戰術問題 也就說沒有回答怎麼賦值的問題。函式引數的使用可以分為兩個方面,一是函式引數如何定義,二是函式在呼叫時的引數如何解析的。而後者又是由前者決定的。函式引數的定義有四種形式 1.f arg...

python變數傳遞 Python引數傳遞

在 python 中,型別屬於物件,變數是沒有型別的 a 1,2,3 a runoob 以上 中,1,2,3 是 list 型別,runoob 是 string 型別,而變數 a 是沒有型別,她僅僅是乙個物件的引用 乙個指標 可以是指向 list 型別物件,也可以是指向 string 型別物件。可更...