生活不易 我用python

说说 Python 序列增量赋值的效率

2020-10-02  本文已影响0人  deniro

*= 在可变和不可变序列上在实现方式上是不同的。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 会把原来对象中的元素先复制到新的对象中,然后再追加新的元素。

上一篇 下一篇

猜你喜欢

热点阅读