日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
一個(gè)看似初級(jí)的Python小問(wèn)題,高手也難保不掉進(jìn)坑里

本文轉(zhuǎn)載自微信公眾號(hào)「Python作業(yè)輔導(dǎo)員」,作者天元浪子 。轉(zhuǎn)載本文請(qǐng)聯(lián)系Python作業(yè)輔導(dǎo)員公眾號(hào)。

創(chuàng)新互聯(lián)專(zhuān)注于保康企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開(kāi)發(fā),商城網(wǎng)站定制開(kāi)發(fā)。??稻W(wǎng)站建設(shè)公司,為??档鹊貐^(qū)提供建站服務(wù)。全流程按需定制網(wǎng)站,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)

昨晚有同學(xué)問(wèn)了一個(gè)非常有意思的問(wèn)題。問(wèn)題本身很簡(jiǎn)單,卻包含了初學(xué)者不易理解、編碼實(shí)踐中又處處可見(jiàn)的幾個(gè)知識(shí)點(diǎn)。如果對(duì)這些知識(shí)點(diǎn)理解有偏差,即便是經(jīng)驗(yàn)豐富的Python程序員,稍不留神也會(huì)掉進(jìn)坑里。

 
 
 
 
  1. def f(w, a, b): 
  2.     w.append(a) 
  3.     w = w + [b] 
  4.     return w 
  5.  
  6. w, a, b = [5, 9], 2, 1 
  7. w = f(w, a, b) + w 
  8. print(w) 

如果將上面代碼稍作改動(dòng),函數(shù)中的賦值操作(=)變成加等操作(+=),正確的輸出結(jié)果又是哪一個(gè)呢?

 
 
 
 
  1. def f(w, a, b): 
  2.     w.append(a) 
  3.     w += [b] 
  4.     return w 
  5.  
  6. w, a, b = [5, 9], 2, 1 
  7. w = f(w, a, b) + w 
  8. print(w) 

要想正確回答問(wèn)題,首先要了解可變對(duì)象和不可變對(duì)象的概念,以及可變對(duì)象和不可變對(duì)象作為函數(shù)參數(shù)是如何向函數(shù)傳參的。

那么,什么是可變對(duì)象、什么是不可變對(duì)象呢?在Python中,整型(int)、浮點(diǎn)型(float)、布爾型(bool)、元組(tuple)和字符串(str)等內(nèi)置類(lèi),一旦實(shí)例化就不可改變,屬于不可變對(duì)象;而列表(list)、字典(dict)和集合(set)等內(nèi)置類(lèi),實(shí)例化后得到對(duì)象,可以任意修改。

讀到這里,有些初學(xué)者可能會(huì)不理解:元組、字符串不可改變,老師和教科書(shū)上都是這么說(shuō)的,整型浮點(diǎn)型對(duì)象為什么不可變呢?讓x=1之后,x就不能改變了嗎?加1不就變成2了嗎?顯然,這是對(duì)對(duì)象概念的誤解。x=1,是讓x指向了值為1的整型對(duì)象,但x并不是真正的整型對(duì)象,只是一個(gè)名字而已,我們稱(chēng)其為變量名或?qū)ο竺?。x加1變成2,并非值為1的整型對(duì)象自身加1,而是讓x指向了另一個(gè)值為2的整型對(duì)象。

 
 
 
 
  1. >>> id(x) 
  2. 2794729897296 
  3. >>> x += 1 
  4. >>> id(x) 
  5. 2794730437616 
  6. >>> y = [1,2] 
  7. >>> id(y) 
  8. 2794699482248 
  9. >>> y += [3] 
  10. >>> id(y) 
  11. 2794699482248 
  12. >>> y = y + [4] 
  13. >>> id(y) 
  14. 2794699482376 

借助Python的id函數(shù)(返回變量名所指對(duì)象的內(nèi)存首地址),可以清楚看到,執(zhí)行加等操作(+=)之后,x指向的整型對(duì)象地址發(fā)生了改變,y指向的列表對(duì)象地址并未改變。不過(guò),對(duì)y執(zhí)行賦值操作(=)之后,y指向的列表對(duì)象地址發(fā)生了改變。這表明,賦值操作(=)是在變量名和對(duì)象之間新建對(duì)應(yīng)關(guān)系,而加等操作(+=)并不改變變量名和對(duì)象之間的對(duì)應(yīng)關(guān)系,除非對(duì)象是不可變的。

理解了可變對(duì)象和不可變對(duì)象的概念之后,就很容易理解可變對(duì)象和不可變對(duì)象作為函數(shù)參數(shù)是如何向函數(shù)傳參的了。如下圖所示,紅色箭頭指向的是可變對(duì)象作為參數(shù)傳遞到函數(shù),綠色箭頭指向的是不可變對(duì)象作為參數(shù)傳遞到函數(shù)。對(duì)于不可變對(duì)象而言,無(wú)論函數(shù)內(nèi)部如何改變這些參數(shù),都不會(huì)影響到函數(shù)外部的不可變對(duì)象,因?yàn)樗麄兪遣豢筛淖兊?。?duì)于可變對(duì)象來(lái)說(shuō),函數(shù)內(nèi)部對(duì)于它們的任何操作都是施加于對(duì)象本身的,這個(gè)對(duì)象即函數(shù)外部的變量所指向的對(duì)象。需要說(shuō)明的是,函數(shù)的參數(shù)傳遞,并不要求實(shí)際參數(shù)和形式參數(shù)同名,下圖紅綠箭頭對(duì)應(yīng)的實(shí)際參數(shù)和形式參數(shù)名字相同,僅是我個(gè)人的習(xí)慣,并非規(guī)則要求。

是時(shí)候進(jìn)入正題了。第一段代碼中,可變對(duì)象w和不可變對(duì)象a、b作為參數(shù)傳進(jìn)函數(shù)后,內(nèi)部變量名w和外部變量名w指向同一個(gè)對(duì)象,append操作自然也會(huì)影響外部變量名w所指向的列表對(duì)象。其后的賦值操作將函數(shù)內(nèi)部的變量名w指向了另外一個(gè)新的列表對(duì)象,因而不會(huì)改變外部的變量名w所指向的列表對(duì)象。如下圖所示,不言自明,代碼最后的輸出結(jié)果應(yīng)該是D,即[5, 9, 2, 1, 5, 9, 2]。

在第二段代碼中,由于+=操作不改變內(nèi)部變量w的指向,外邊變量w所指向的列表自然也變成了[5, 9, 2, 1],最終的輸出結(jié)果是兩個(gè)[5, 9, 2, 1]相加,正確答案是E, 如下圖所示。


當(dāng)前名稱(chēng):一個(gè)看似初級(jí)的Python小問(wèn)題,高手也難保不掉進(jìn)坑里
轉(zhuǎn)載源于:http://www.dlmjj.cn/article/cdgsies.html