成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一個看似初級的Python小問題,高手也難保不掉進坑里

開發 后端
昨晚有同學問了一個非常有意思的問題。問題本身很簡單,卻包含了初學者不易理解、編碼實踐中又處處可見的幾個知識點。如果對這些知識點理解有偏差,即便是經驗豐富的Python程序員,稍不留神也會掉進坑里。

[[405302]]

本文轉載自微信公眾號「Python作業輔導員」,作者天元浪子 。轉載本文請聯系Python作業輔導員公眾號。

昨晚有同學問了一個非常有意思的問題。問題本身很簡單,卻包含了初學者不易理解、編碼實踐中又處處可見的幾個知識點。如果對這些知識點理解有偏差,即便是經驗豐富的Python程序員,稍不留神也會掉進坑里。

  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) 

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

  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) 

要想正確回答問題,首先要了解可變對象和不可變對象的概念,以及可變對象和不可變對象作為函數參數是如何向函數傳參的。

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

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

  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函數(返回變量名所指對象的內存首地址),可以清楚看到,執行加等操作(+=)之后,x指向的整型對象地址發生了改變,y指向的列表對象地址并未改變。不過,對y執行賦值操作(=)之后,y指向的列表對象地址發生了改變。這表明,賦值操作(=)是在變量名和對象之間新建對應關系,而加等操作(+=)并不改變變量名和對象之間的對應關系,除非對象是不可變的。

理解了可變對象和不可變對象的概念之后,就很容易理解可變對象和不可變對象作為函數參數是如何向函數傳參的了。如下圖所示,紅色箭頭指向的是可變對象作為參數傳遞到函數,綠色箭頭指向的是不可變對象作為參數傳遞到函數。對于不可變對象而言,無論函數內部如何改變這些參數,都不會影響到函數外部的不可變對象,因為他們是不可改變的。對于可變對象來說,函數內部對于它們的任何操作都是施加于對象本身的,這個對象即函數外部的變量所指向的對象。需要說明的是,函數的參數傳遞,并不要求實際參數和形式參數同名,下圖紅綠箭頭對應的實際參數和形式參數名字相同,僅是我個人的習慣,并非規則要求。

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

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

 

責任編輯:武曉燕 來源: Python作業輔導員
相關推薦

2009-08-25 15:23:16

C#子線程

2018-06-01 09:11:23

2020-06-09 08:00:52

Python開發代碼

2017-12-05 15:32:44

深度學習語音識別

2011-05-31 15:38:37

CSS

2017-11-29 14:18:45

2019-01-07 14:54:00

管理結構性思維測試

2025-03-25 10:35:37

OraclePython數據庫

2011-06-29 15:52:14

友情鏈接

2021-09-26 05:25:33

邊緣計算IoT

2024-05-20 01:10:00

Promise變量

2023-07-17 09:19:20

CSSCSS 漸變

2009-09-15 09:23:35

初級linuxLinuxlinu操作系統x后門

2010-05-31 14:22:25

RFID安全

2024-02-28 08:12:25

SSE接口代理

2018-08-07 10:54:02

HTTPS郵箱瀏覽器

2011-07-04 09:39:31

項目管理

2018-08-15 10:51:01

JavaSpring MVC框架

2025-03-28 08:30:00

PythonPandasaxis

2012-08-13 11:11:28

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品不卡| 久久精品视频网站 | 欧美色视频免费 | 日日骚网 | 免费成人毛片 | 夜夜摸夜夜操 | 亚洲一区二区三区在线播放 | 久久精品91久久久久久再现 | 韩国av一区二区 | 国产91视频播放 | 干干干日日日 | 毛片在线免费 | 人人操日日干 | 成人a免费 | 91在线视频观看免费 | 午夜精品久久久久久久星辰影院 | 97天天干 | 国产精品高潮呻吟久久 | 精品一区久久 | 嫩草懂你的影院入口 | 精品一区欧美 | 欧美伦理一区 | 91久久国产综合久久91精品网站 | 久草视频观看 | 91视频88av| av大全在线观看 | 7777在线| 一区二区三区精品视频 | 国产精品区二区三区日本 | 天天爽夜夜骑 | 日日操夜夜操天天操 | 夜夜夜操| 免费看黄色小视频 | 国产成人精品免费 | www日本在线观看 | 黄色片大全在线观看 | 色偷偷888欧美精品久久久 | 成人免费观看男女羞羞视频 | 欧美电影一区 | 一级黄色日本片 | 国产麻豆乱码精品一区二区三区 |