在分析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 型別物件。可更...