Python函數(shù)傳遞參數(shù):對(duì)象引用

一猖闪、變量與對(duì)象

  1. Python 中一切皆為對(duì)象,數(shù)字是對(duì)象吵护,列表是對(duì)象,函數(shù)也是對(duì)象雄坪,任何東西都是對(duì)象。

  2. 變量是對(duì)象的一個(gè)引用,又稱名字或者標(biāo)簽谒亦,對(duì)象的操作都是通過(guò)引用來(lái)完成的。

  3. 賦值操作 = 就是把一個(gè)引用綁定到一個(gè)對(duì)象上锁摔。例如,[]是一個(gè)空列表對(duì)象,賦值給變量a,變量 a 是該對(duì)象的一個(gè)引用芹枷。

a = []
a.append(1)


二、對(duì)象的可變性

  1. 不可變對(duì)象:對(duì)象所指向的內(nèi)存中的值不能被改變走芋。不可變對(duì)象賦值給變量后嗽上,由于變量指向的值不可變,如果改變變量(準(zhǔn)確的說(shuō)是引用)哲思,相當(dāng)于對(duì)變量進(jìn)行了重新賦值徘郭,指向了內(nèi)存中新的值胧后。
  • 變量a引用了內(nèi)存中的對(duì)象:1
a = 1
  • 對(duì)象1在內(nèi)存中的地址
print(a, id(1))     
print(a, id(a))
1 4496995664
1 4496995664
  • 變量a重新賦值眶痰,引用了內(nèi)存中的對(duì)象:2
a = 2
  • 對(duì)象2在內(nèi)存中的地址
print(a, id(2))
print(a, id(a))
2 4496995696
2 4496995696


2. 可變對(duì)象:對(duì)象所指向的內(nèi)存中的值可以被改變条辟。如果改變變量(準(zhǔn)確的說(shuō)是引用),實(shí)際上只是對(duì)其所指的值進(jìn)行了變更氛赐,并沒(méi)有產(chǎn)生新的值,通俗點(diǎn)說(shuō)就是原地改變。

lt = [1, 2, 3]
print(id(lt))
4551719624

lt.append(100)
print(id(lt))
4551719624
  1. Python中,數(shù)值類型(int和float)、字符串str卜高、元組(tuple)都是不可變類型掺涛,而列表(list)矮燎、字典(dict)峡谊、集合(set)是可變類型。

三盾致、函數(shù)傳參

  1. Python函數(shù)中,參數(shù)傳遞的全部都是對(duì)象的引用,本質(zhì)上是賦值操作蜓席,即把一個(gè)引用(變量)綁定到一個(gè)對(duì)象上。

  2. 參數(shù)是不可變對(duì)象時(shí),不會(huì)對(duì)對(duì)象進(jìn)行修改此洲,相當(dāng)于傳遞值衷畦。

  3. 參數(shù)是可變對(duì)象時(shí)暖释,會(huì)對(duì)對(duì)象進(jìn)行修改亮曹,相當(dāng)傳遞引用。

  4. 在定義函數(shù)時(shí)板熊,要注意函數(shù)的參數(shù)喘沿,傳遞的是值還是引用摹恨,特別是對(duì)于 默認(rèn)參數(shù) 寝凌,很容易導(dǎo)致潛在的bug较木。

四伐债、函數(shù)的默認(rèn)參數(shù)

  1. 默認(rèn)參數(shù)是傳遞值時(shí)虹蒋,僅僅在函數(shù)定義的時(shí)候賦值一次晃虫。
x = 8

def func(a, b=x):
    return a, b

print(func(1))
(1, 8)

x = 20
print(func(1))
(1, 8)
  • 示例中,默認(rèn)參數(shù)b賦值為x型酥,x為不可變對(duì)象字符串8讥蟆,當(dāng)對(duì)x重新賦值為20后,調(diào)用函數(shù)時(shí)纺阔,默認(rèn)參數(shù)b的值仍然為8瘸彤。
  • 默認(rèn)參數(shù)的值,通常應(yīng)該是不可變的對(duì)象笛钝,比如None质况、True愕宋、False、數(shù)字或字符串结榄。
  1. 默認(rèn)參數(shù)是傳遞引用時(shí)中贝,通常為空,比如空列表[]或空集合{}潭陪,但在定義函數(shù)時(shí)雄妥,盡量設(shè)置為None,而不要讓參數(shù)直接等于空列表或空集合依溯。
def fun(a, b = []):
    return b 

f = fun(1)
print(f)
[]

f.append(100)
print(f)
[100]
  • 像上述示例中老厌,如果設(shè)置默認(rèn)參數(shù)b = [],因?yàn)槭强勺儗?duì)象黎炉,當(dāng)默認(rèn)參數(shù)b的對(duì)象枝秤,在其他地方被修改后,下次調(diào)用這個(gè)函數(shù)時(shí)其默認(rèn)參數(shù)b 已不再是空列表慷嗜。
  • 特殊情況下淀弹,比如在for循環(huán)中,調(diào)用默認(rèn)參數(shù)為空列表[]或空集合{}的函數(shù)庆械,可以循環(huán)累積迭代結(jié)果薇溃。

五、匿名函數(shù)捕獲參數(shù)值

  1. lambda表達(dá)式中的參數(shù)x是一個(gè)自由變量缭乘, 是在執(zhí)行時(shí)賦值(綁定)沐序,而不是定義時(shí)賦值(綁定),即lambda表達(dá)式中的參數(shù)x是執(zhí)行時(shí)的值堕绩,這與函數(shù)的 默認(rèn)參數(shù) 賦值不相同策幼。
x = 10
a = lambda y: y + x

x = 20 
print(a(10))
30

?示例中,調(diào)用a(10)時(shí)奴紧,x取值為20特姐,而不是定義時(shí)的10

  1. 如果想讓匿名函數(shù)黍氮,在定義時(shí)就捕獲到參數(shù)值唐含,將參數(shù)x定義成默認(rèn)參數(shù)即可,例如:
z = 10
a = lambda x, z=z: x + z 

print(a(2))
12

z = 7
print(a(2))
12

?示例中沫浆,對(duì)變量z重新賦值為7觉壶,再次調(diào)用函數(shù)a(2)時(shí),匿名函數(shù)的參數(shù)z的值仍
?然為定義時(shí)的10件缸,而不是7 铜靶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子争剿,更是在濱河造成了極大的恐慌已艰,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚕苇,死亡現(xiàn)場(chǎng)離奇詭異哩掺,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)涩笤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門嚼吞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蹬碧,你說(shuō)我怎么就攤上這事舱禽。” “怎么了恩沽?”我有些...
    開(kāi)封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵誊稚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我罗心,道長(zhǎng)里伯,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任渤闷,我火速辦了婚禮疾瓮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘飒箭。我一直安慰自己狼电,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布补憾。 她就那樣靜靜地躺著漫萄,像睡著了一般卷员。 火紅的嫁衣襯著肌膚如雪盈匾。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天毕骡,我揣著相機(jī)與錄音削饵,去河邊找鬼。 笑死未巫,一個(gè)胖子當(dāng)著我的面吹牛窿撬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叙凡,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼劈伴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了握爷?” 一聲冷哼從身側(cè)響起跛璧,我...
    開(kāi)封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤严里,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后追城,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體刹碾,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年座柱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了迷帜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡色洞,死狀恐怖戏锹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锋玲,我是刑警寧澤景用,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站惭蹂,受9級(jí)特大地震影響伞插,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盾碗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一媚污、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧廷雅,春花似錦耗美、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至芥玉,卻和暖如春蛇摸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灿巧。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工赶袄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抠藕。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓饿肺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親盾似。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敬辣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359