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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python choose语句作用_理解闭包是如何与变量作用域相互影响的

發布時間:2023/12/10 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python choose语句作用_理解闭包是如何与变量作用域相互影响的 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文標題:KNOW HOW CLOSURES INTERACT WITH VARIABLE SCOPE

比如說你現在想要對一組數字進行排序,同時希望提高一組數字的優先級使這組數字優先顯示。這種模式在展示用戶接口時非常有用,在展示用戶接口時經常需要優先展示一些重要信息以及異常事件。

解決這類問題的一個常用方法是在調用排序方法時傳遞一個幫助方法作為關鍵字參數。幫助方法的返回值用于對列表中的每一個元素進行排序。幫助方法能夠檢查列表中的值是否屬于優先顯示數組。幫助方法的實例代碼如下:

下面是一個簡單應用:

這個幫助方法能夠正常工作有3個原因:

  • Python支持閉包:方法可以引用包含它們的作用域內的變量(functions that refer to variables from the scope in which they were defined)。這就是為什么helper方法可以訪問group參數。
  • 在Python中方法是第一類對象(first-class object), 這意味著你可以直接引用方法、將方法賦值給變量、作為參數將方法傳遞給另一個方法、在if語句或者表達式用比較方法。這就是為什么sort方法可以接收另一個方法作為參數。
  • Python針對元組有一套特殊的比較規則。Python中元組的比較是按照元組中每個元素進行比較的,首先比較第0個元素,然后比較第一個,然后第二個,一直比較下去。這就是為什么在helper方法中返回兩個不同的元組。

如果幫助方法在返回以上元組之外還能返回元素是否出現在了優先數組中將會對調用者更有幫助。看起來在前面代碼的基礎上實現這個行為非常容易,只需要在將代碼做如下調整即可:

執行代碼:

排序正確但是found結果錯誤。這是為什么呢?

當你在一個表達式中引用變量時,Python解釋器會按照以下順序遍歷所有作用域來找到參數引用:

  • 當前方法的作用域
  • 任何閉合作用域(例如其它外圍方法)
  • 包含當前代碼的模塊的作用域(也叫 global作用域)
  • 內嵌作用域(例如len和str)

如果遍歷完上面全部作用域還沒有找到需要引用的名字,就會拋出一個NameError。

但是給變量賦值的順序就不一樣了。如果在當前作用域中已經定義了變量,那么這個變量就會直接獲得新值。如果當前作用域中沒有這個變量,那么Python會把賦值語句當作變量定義。這個新變量的作用域就是包含賦值語句的方法。

賦值語句的行為就解釋了為什么sort_priority2 的返回值錯誤了。found變量在helper中被賦予了true,閉包中的賦值語句被認為是一個新變量,這不影響外面方法中的變量。

兩個found的作用域:

這就是閉包bug。但是這又是希望的結果。這種行為可以有效的防止方法中的變量污染外部模塊。否則方法內部的任意賦值語句都會影響全局變量。這樣會產生很多噪音,還會引起奇怪的bug。

使數據可以被訪問

Python 3:在Python 3中有一種特殊語法可以使閉包內的數據被提取出來。使用nonlocal語句可以指定一個變量的遍歷方式是從上級開始遍歷。唯一的限制就是nonlocal不能遍歷到模塊級別(防止污染全局變量)。

下面使用nonlocal語句重寫上面的方法:

在此,nonlocal語句可以很清晰的將一個作用域的變量以入到另一個作用域。它是對global語句的一個補充,global指定全局變量。

然而,就像全局變量的反面模式一樣(much like the anti-pattern of global variables),除了簡單的函數,我不建議大家使用nonlocal。nonlocal的副作用很難被追蹤。尤其是在一個非常長的方法中,nonlocal語句、賦值語句與相關的變量離的非常遠的情況。

一旦nonlocal是的代碼變復雜,你就需要考慮是否可以將代碼打包成一個幫助方法。下面我修改前面的代碼,不使用nonlocal以達到同樣目的,代碼有點長,但是更易于閱讀:

Python 2:不幸的是,Python 2中根本就沒有nonlocal關鍵字。為了達到同樣目的,你需要利用Python的高級用法來實現一個變通方法。下面的代碼實現并不友好,但卻是Python中的常用方法。

就像前面解釋的一樣,Python會向上遍歷found被引用的域以確定found當前的值。這里引起欺詐性就是found是一個列表,它的值非常易變。這意味著,一旦found被檢索到,閉包方法就可以修改found的狀態進而把值從內部作用域中傳遞出來(在這里使用 found[0] = True)。

除了使用列表,通過使用字典、集合、類的實例一樣可以在域間傳值。

注意事項:

  • 閉包方法可以在它們定義的作用域內引用任何變量;
  • 默認情況下,閉包方法不能給外部變量賦值;
  • 在Python 3中可以使用nonlocal語句指定修改閉包以外的變量;
  • 在Python 2中使用可變值變量來代替nonlocal語句;
  • 除了非常簡單的方法外,避免使用nonlocal語句。

總結

以上是生活随笔為你收集整理的python choose语句作用_理解闭包是如何与变量作用域相互影响的的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。