說說 Python 序列增量賦值的效率
*= 在可變和不可變序列上在實現方式上是不同的。Luciano Ramalho 舉了這樣一個示例:
l = [1, 2, 3]
logging.info('id(l) -> %s', id(l))
l *= 2
logging.info('l -> %s', l)
logging.info('id(l) -> %s', id(l))
t = (1, 2, 3)
logging.info('id(t) -> %s', id(t))
t *= 2
logging.info('t -> %s', t)
logging.info('id(t) -> %s', id(t))
執行結果:
INFO - id(l) -> 1692299406664
INFO - l -> [1, 2, 3, 1, 2, 3]
INFO - id(l) -> 1692299406664
INFO - id(t) -> 1692297005000
INFO - t -> (1, 2, 3, 1, 2, 3)
INFO - id(t) -> 1692297091304
id() 函式返回物件的唯一識別符號,識別符號是一個整數。
可以看到在可變序列上(示例中是陣列)增量賦值,仍然在同一個物件上;但如果對不可變序列上(示例中是元組)增量賦值,這個物件已經是一個新物件。
對不可變序列進行增量賦值操作效率會很低,因為每次都會建立一個新物件,python 會把原來物件中的元素先複製到新的物件中,然後再追加新的元素。
相關文章
- Python3序列賦值、序列解包詳解(下)Python賦值
- 細說HTTP增量更新HTTP
- (12)非阻塞賦值與阻塞賦值區別(以簡單例子說明)賦值單例
- 說說 Python 的列表Python
- 說說 Python 的 if 語句Python
- Python使用Protobuf&&如何賦值&&如何正反序列化Python賦值
- python的賦值傳遞Python賦值
- 說下line-height三種賦值方式有何區別?賦值
- 說說如何使用 Python 類的屬性Python
- 從java的序列化和反序列化說起Java
- 簡單說說vue的父子元件,父子元件傳值和vuexVue元件
- 說說在 Python 中如何匯入類Python
- 說說在 Python 中如何遍歷字典Python
- python的partial()用法說明Python
- Java 大檔案IO操作效率對比【我說說 你瞅瞅】Java
- 說說 Python 的變數以及簡單資料型別Python變數資料型別
- 說說在 Python 中,如何寫入檔案Python
- 說說在 Python 中如何測試函式Python函式
- 說說在 Python 中如何處理異常Python
- 能取值亦能賦值的Python切片賦值Python
- Python包的匯入說明Python
- 說說在 Python 中如何傳遞任意數量的實參Python
- 說說在 Python 中,如何讀取檔案中的資料Python
- 來說說目前受歡迎的10個Python開源框架Python框架
- 說說java的反射Java反射
- 為什麼說培訓是入行IT效率最高的方式?
- 說說在 Python 中如何向函式傳參Python函式
- 提高 Java 效率的 35 個小技巧,用了的都說好!Java
- 說下Python入門Python
- 聽說你會 Python ?Python
- php之普通變數賦值、物件賦值、引用賦值的區別PHP變數賦值物件
- 用一個簡易的 web chat 說說 Python、Golang、Nodejs 的非同步WebPythonGolangNodeJS非同步
- 白說:php反序列化之pop鏈PHP
- 說說劫持 Cookie 的原理Cookie
- 說說React元件的StateReact元件
- 說說Flutter中的RepaintBoundaryFlutterAI
- 說說Flutter中的SemanticsFlutter
- 說說你對this的理解