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