在分析python的參數傳遞是如何進行的以前,咱們須要先來了解一下,python變量和賦值的基本原理,這樣有助於咱們更好的理解參數傳遞。html
從幾行代碼開始java
In [1]: a = 1 In [2]: b = a In [3]: 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的值:python
In [4]: a Out[4]: 2 In [5]: b Out[5]: 1
經過這個例子你能夠看到,這裏的 a 和 b,開始只是兩個指向同一個對象的變量而已,或者你也能夠把它們想象成同一個對象的兩個名字。簡單的賦值 b = a,並不表示從新建立了新對象,只是讓同一個對象被多個變量指向或引用。同時,指向同一個對象,也並不意味着兩個變量就被綁定到了一塊兒。若是你給其中一個變量從新賦值,並不會影響其餘變量的值。數據結構
還有一個列表的例子,再來瞅瞅:app
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的時候就會把它回收掉。code
總結htm
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) a 2
上面的例子咱們的是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 中參數的傳遞既不是值傳遞,也不是引用傳遞,而是賦值傳遞,或者是叫對象的引用傳遞。須要注意的是,這裏的賦值或對象的引用傳遞,不是指向一個具體的內存地址,而是指向一個具體的對象。
本文連接:https://immortalp.com/article...
歡迎你們去 個人博客 瞅瞅,裏面有更多關於測試實戰的內容哦!!