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

您能解決這3個(看似)簡單的Python問題嗎?

開發 后端
Python中可變對象與不可變對象之間的區別非常重要。 請注意這一點,以避免出現本文所述的奇怪行為

嘗試解決以下問題,然后檢查以下答案。

提示:所有問題都有共同點,因此在解決其余問題之前檢查第一個問題的解決方案可以減輕挑戰。

[[329422]]

問題1

假設我們有幾個變量:

  1. x = 1 
  2. y = 2 
  3. l = [x, y] 
  4. x += 5 
  5. a = [1] 
  6. b = [2] 
  7. s = [a, b] 
  8. a.append(5) 

l和s的打印結果是什么?

跳到解決方案

問題2

讓我們定義一個簡單的函數:

  1. def f(x, s=set()): 
  2. s.add(x) print(s) 

如果您決定,將會發生什么:

  1. >>f(7)  
  2. >>f(6, {4, 5})  
  3. >>f(2)  
  4. ? 

跳到解決方案

問題3

讓我們定義兩個簡單的函數:

  1. def f(): 
  2.     l = [1] 
  3.     def inner(x): 
  4.         l.append(x) 
  5.         return l 
  6.     return inner 
  7. def g(): 
  8.     y = 1 
  9.     def inner(x): 
  10.         y += x 
  11.         return y 
  12.     return inner 

以下命令將產生什么結果?

  1. >>ff_inner = f() 
  2. >>print(f_inner(2)) 
  3. >>gg_inner = g() 
  4. >>print(g_inner(2)) 

跳到解決方案

您對自己的回答有多自信? 讓我們看看您是否正確。

解決問題1

  1. >>print(l) 
  2.  
  3. [1, 2] 
  4.  
  5. >>print(s) 
  6.  
  7. [[1, 5], [2]] 

為什么第二個列表對第一個元素a.append(5)的更改有反應,但是第一個列表完全忽略x + = 5的類似變化?

解決問題2

讓我們看看發生了什么:

  1. >>f(7){7}  
  2. >>f(6, {4, 5}){4, 5, 6}  
  3. >>f(2){2, 7} 

等待,最后輸出不是{2}嗎?

解決問題3

輸出將是以下內容:

  1. >>ff_inner = f()  
  2. >>print(f_inner(2))[1, 2]  
  3. >>gg_inner = g()  
  4. >>print(g_inner(2))  
  5. UnboundLocalError: local variable 'y' referenced before assignment 

為什么g_inner(2)不輸出3? f()的內部函數如何記住其外部范圍,而g()的內部函數卻不記得呢? 它們實際上是相同的!

說明

如果我告訴您這些怪異的行為與Python中可變對象和不可變對象之間的區別有關怎么辦?

諸如列表,集合或字典之類的可變對象可以在適當位置進行更改(變異)。 不變的對象(如整數,字符串和元組)不能—此類對象的"更改"會導致創建新對象。

問題1的說明

  1. x = 1 
  2. y = 2 
  3. l = [x, y] 
  4. x += 5 
  5. a = [1] 
  6. b = [2] 
  7. s = [a, b] 
  8. a.append(5) 
  9. >>print(l) 
  10. [1, 2] 
  11. >>print(s) 
  12. [[1, 5], [2]] 

由于x是不可變的,因此操作x + = 5不會更改原始對象,而是創建一個新對象。 列表的第一個元素仍指向原始對象,因此其值保持不變。

對于可變對象a,a.append(5)更改原始對象,因此list s"看到"更改。

問題2的解釋

  1. def f(x, s=set()): 
  2.     s.add(x) 
  3.     print(s) 
  4. >>f(7) 
  5. {7} 
  6. >>f(6, {4, 5}) 
  7. {4, 5, 6} 
  8. >>f(2) 
  9. {2, 7} 

前兩個輸出完全有意義:首先將值7添加到默認空集中,得到{7},然后將值6添加到一組{4,5}中,得到{4,5,6 }。

但是隨后發生了一件奇怪的事情:將值2添加到默認的空集而不是添加到{7}的集。 為什么? 可選參數s的默認值僅被評估一次-僅在第一次調用s期間將被初始化為空集。 由于s在調用f(7)之后是可變的,因此就地進行了修改。 第二個調用f(6,{4,5})不會影響默認參數-提供的集合{4,5}將其遮蔽,換句話說,{4,5}是一個不同的變量。 第三次調用f(2)使用的是與第一次調用相同的s變量,但是s未作為空集重新初始化-使用了其先前的值{7}。

這就是為什么您不應該使用可變的默認參數的原因。 在這種情況下,應按以下方式修改功能:

  1. def f(x, s=None): 
  2.     if s is None: 
  3.         s = set() 
  4.     s.add(x) 
  5.     print(s) 

問題3的解釋

  1. def f(): 
  2.     l = [1] 
  3.     def inner(x): 
  4.         l.append(x) 
  5.         return l 
  6.     return inner 
  7. def g(): 
  8.     y = 1 
  9.     def inner(x): 
  10.         y += x 
  11.         return y 
  12.     return inner 
  13. >>ff_inner = f() 
  14. >>print(f_inner(2)) 
  15. [1, 2] 
  16. >>gg_inner = g() 
  17. >>print(g_inner(2)) 
  18. UnboundLocalError: local variable ‘y’ referenced before assignment 

在這個問題中,我們處理閉包-內部函數記住定義時它們的封閉名稱空間的外觀。 或至少應該如此-第二個功能保持撲克面孔,就像從未聽說過其外部作用域一樣。

這是為什么? 當我們執行l.append(x)時,在定義時創建的可變對象被修改,但是變量l仍然指向內存中的相同地址。 但是,嘗試更改第二個函數y + = x中的不可變變量會導致y指向內存中與以前不同的地址-原始y將不再被記住,因此導致UnboundLocalError。

結論

Python中可變對象與不可變對象之間的區別非常重要。 請注意這一點,以避免出現本文所述的奇怪行為。 特別是:

  • 不要使用可變的默認參數。
  • 不要嘗試在內部函數中更改不可變的閉包變量。
  • 請隨意分享其他示例,這些示例可能是由于您在響應中誤用了可變的和不變的對象而導致的潛在問題。

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2019-05-06 08:55:49

物聯網安全物聯網IOT

2017-05-11 08:46:35

全閃存數據中心容量

2021-04-22 10:23:36

人工智能自動駕駛芯片

2024-01-18 16:19:31

數據治理AI疲勞數據安全

2022-09-13 14:47:55

區塊鏈房地產傭金

2018-04-23 09:11:40

2019-09-11 09:05:18

Linux命令

2013-12-18 10:09:12

SVCHOST進程Windows Upd

2022-04-04 07:51:32

Web框架

2023-04-09 15:23:58

Python編程開發

2018-10-19 11:55:36

數據庫Redis命令

2018-02-01 08:39:29

超融合實質性問題

2020-06-22 15:41:20

IF函數Excel用法

2021-01-10 23:36:52

SQL數據庫技術

2022-05-16 07:48:54

Python操作類型

2022-05-03 18:32:26

元宇宙醫療

2013-04-28 12:37:48

通訊

2021-07-16 23:50:51

區塊鏈影視版權

2021-06-11 17:03:25

Python浮點型布爾型

2022-06-29 07:49:42

云存儲架構DevOps
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美电影大全 | 在线观看亚洲精品视频 | 日韩免费视频一区二区 | av一级| 免费不卡视频 | 精品视频一区二区三区在线观看 | 色婷婷久久久亚洲一区二区三区 | 久久久久久久久久久久久久av | 中文字幕成人免费视频 | 羞羞的视频免费观看 | 欧美xxxx在线 | 久久久黄色| 国产精品波多野结衣 | 亚洲精品久久久一区二区三区 | 欧美一级二级在线观看 | 中文字幕一区二区三区四区 | 激情欧美日韩一区二区 | 久久精品91久久久久久再现 | 国产精品一区二区免费看 | 极品粉嫩国产48尤物在线播放 | 天堂成人av| 久久久九九 | 一区二区三区视频 | 午夜精品91 | 九九热精品视频 | 久热精品在线观看视频 | 免费在线看a| 国产精品免费一区二区三区四区 | 亚洲精品一区中文字幕乱码 | 国产在线一区观看 | 日日干日日射 | 在线一区观看 | 一级二级三级在线观看 | 久久久久久久香蕉 | 91一区二区三区 | 国产一区二区电影网 | 午夜精品一区二区三区三上悠亚 | 国产激情福利 | 国产精品色一区二区三区 | 日本成人久久 | 国产中文|