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

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

生活随笔

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

python

python函数在传参的时候,到底在传些什么?

發(fā)布時(shí)間:2024/7/5 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python函数在传参的时候,到底在传些什么? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C++這樣的語(yǔ)言用多了之后,在Python函數(shù)傳遞參數(shù)的時(shí)候,經(jīng)常會(huì)遇到一個(gè)問(wèn)題,我要傳遞一個(gè)引用怎么辦?
比如我們想要傳一個(gè)x到函數(shù)中做個(gè)運(yùn)算改變x的值:

def change(y):y += 1x = 1 print ("before change:", x) change(x) print ("after change: ", x)

得到的結(jié)果是

before change: 1 after change: 1

完全沒(méi)用~~~這是怎么回事?
我來(lái)說(shuō)明一下這個(gè)過(guò)程~


也就是說(shuō)python中的等號(hào)就是把變量指向了一個(gè)實(shí)例而已。
那么,如何做到其它語(yǔ)言中引用這樣的效果呢?一個(gè)比較推薦的方法就是用把參數(shù)return回去就可以了,如下面代碼所示。

def change(y):y += 1return yx = 1 print ("before change:", x) x = change(x) print ("after change: ", x)

結(jié)果為

before change: 1 after change: 2

另一種方法就是,我們不讓函數(shù)中的參數(shù)指向新的地址不就可以了,我們讓它在原來(lái)的地址上修改我們的值。這一點(diǎn),只有一部分的數(shù)據(jù)類型可以做到,我們把這樣的對(duì)象叫做可變對(duì)象,做不到的就叫不可變對(duì)象。

  • 不可變對(duì)象:int,string,float,tuple 等
  • 可變對(duì)象 :list,dictionary 等

舉幾個(gè)例子更為通俗易懂

def change(x):print ("before append:", x, "id:", id(x))x.append(0)print ("after append:", x, "id:", id(x))x = [1, 2, 3] print ("before change:", x, "id:", id(x)) change(x) print ("after change:", x, "id:", id(x)) before change: [1, 2, 3] id: 140623459512008 before append: [1, 2, 3] id: 140623459512008 after append: [1, 2, 3, 0] id: 140623459512008 after change: [1, 2, 3, 0] id: 140623459512008

由于list在做append操作時(shí),x指向的地址是不變的,所以可以有引用的效果,x[0] = 4這樣的操作也是沒(méi)問(wèn)題的
然而,如果是把x指向了新的地址就不行了,如下

def change(x):print ("before equal:", x, "id:", id(x))x = [5]print ("after equal:", x, "id:", id(x))x = [1, 2, 3] print ("before change:", x, "id:", id(x)) change(x) print ("after change:", x, "id:", id(x)) before change: [1, 2, 3] id: 139683058095432 before equal: [1, 2, 3] id: 139683058095432 after equal: [5] id: 139683058028360 after change: [1, 2, 3] id: 139683058095432

這下應(yīng)該就搞清楚是怎么回事了吧,不過(guò)正是因?yàn)閜ython的這種特性,在函數(shù)設(shè)置默認(rèn)參數(shù)的時(shí)候,我們要注意盡量不用可變對(duì)象當(dāng)默認(rèn)值,否則會(huì)發(fā)生下面這種情況

def change(x=[]):x.append(1)return xprint (change()) print (change()) [1] [1, 1]

比較妥當(dāng)?shù)淖龇ㄊ怯貌豢勺儗?duì)象來(lái)代替[],比如None

def change(x=None):if not x:x = []x.append(1)return xprint (change()) print (change())

此時(shí)的輸出為

[1] [1]

總結(jié)

以上是生活随笔為你收集整理的python函数在传参的时候,到底在传些什么?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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