說說 Python 序列增量賦值的效率

deniro_li發表於2020-10-01

*= 在可變和不可變序列上在實現方式上是不同的。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 會把原來物件中的元素先複製到新的物件中,然後再追加新的元素。

相關文章