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