日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python函数参数传递:传值还是传引用

發(fā)布時(shí)間:2023/12/2 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python函数参数传递:传值还是传引用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引子

首先來(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等)。?
比如下面的例子:

nums = (1, 2, 3) type(nums) #輸出:tuple id(nums) #輸出:59179256 nums = [1, 2, 3] type(nums) #輸出:list id(nums) #輸出:59094960
  • 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ì)象

def change(val):val = 0 num = 1 change(num) print(num) #輸出結(jié)果為1
  • 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ì)象

def change(val):val.append(1) nums = [0] change(nums) print(nums)
  • 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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。