Python函数参数传递:传值还是传引用
引子
首先來看一個列子:
def change(val):val.append(100)val = ['T', 'Z', 'Y'] nums = [0, 1] change(nums) print(nums)- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
猜猜結果應該是什么??
如果Python函數參數的傳遞是傳值的話,結果應該是[0, 1],如果是傳引用的話,結果應該是[‘T’, ‘Z’, ‘Y’]。?
可是實際結果是:[0, 1, 100]。所以,Python函數參數的傳遞既不是傳值也不是傳引用。
Python函數參數傳遞
那么Python中函數參數到底是以什么形式傳遞的呢??
我們首先明確一些概念:Python中的變量和對象。?
Python中的變量是沒有類型的,我們可以把它看做一個(*void)類型的指針,變量是可以指向任何對象的,而對象才是有類型的。?
而且Python中的對象有可變對象(number,string,tuple等)和不可變對象之分(list,dict等)。?
比如下面的例子:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
可以看到nums是沒有類型的,它可以指向一個tuple也可以指向一個list,從id就可以看出nums指向了不同的對象。?
明白了這個概念,那么我們可以說Python中函數參數的傳遞是傳遞的變量的值。?
而且我們有下面的規律:?
1. 不可變對象作為函數參數,相當于C系語言的值傳遞。?
2. 可變對象作為函數參數,相當于C系語言的引用傳遞。
例子分析
下面我們分析幾個例子:?
1. 不可變對象
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
按照上面的規律1,輸出結果為1。我們分析一下為什么。?
?
我們定義了一個變量num,num指向數字1,然后執行change函數的時候,復制了num變量到val,即剛進入函數體的時候val仍然指向數字1,然后函數體中給val賦值2,因為數字是不可變對象,所以val重新指向了0。但是作為num變量,仍然指向1。?
2. 可變對象
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
這里例子同樣的道理,剛進入change函數體的時候,val指向列表[0],因為列表是可變對象,所以給[0]執行append操作的時候,直接作用在原來的list上不會生成新的對象,所以返回結果是[0, 1]。?
3. 引子中的例子?
開始的時候,nums指向列表[0],然后進入函數體change的時候,val指向列表[0],然后執行append,列表[0]變成[0, 1],然后又將[‘T’, ‘Z’, ‘Y’]賦值給val,所以最后的結果是nums指向的[0]變成了[0, 1]。
所以最重要的一點是明白:Python中函數參數的傳遞是傳遞的變量的值;Python中變量和對象的不同。
總結
以上是生活随笔為你收集整理的Python函数参数传递:传值还是传引用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 并查集(UnionFindSet)
- 下一篇: Python遍历字典的四种方法对比