列表乘法什么时候创建对象的多个副本,什么时候引用同一个对象?

When does list multiplication create multiple copies of the object and when does it reference to the same object?

Mu的困惑源于问题-Difference between [[0]*m]*n and [[0 for i in range(0,m)] for j in range(0,n)]

这里说不引用整数是因为它们很便宜,但列表的复制成本很高,但是它是如何决定复制什么和不复制什么的,我是否应该担心字符串在任何情况下的类似行为或任何其他对象,以防我决定做类似

的事情
[<object>]*m

其实创建[0] * m也是指同一个整数:

>>> lst = [0] * 3
>>> [id(i) for i in lst]
[2751327895760, 2751327895760, 2751327895760]

然而,对于immutable类型,这无害的原因是它们没有原地运行。如果你对它们应用一个看起来像是原地操作的动作,你只会得到一个新的对象,这使得你无法原地修改列表中引用的整数,所以其他整数不会因为一个元素而改变已修改:

>>> x = 0
>>> id(x)
2751327895760
>>> x += 1
>>> id(x)
2751327895792

因此,对于字符串、整数等对象(元组大部分情况下没有问题,但如果元组内部有可变对象要小心!感谢@Kelly Bundy的提醒),没有使用列表乘法的危害。当你想通过乘法创建一个包含相同对象的列表时,如果你能保证你不会原地修改任何一个,那么这个操作可以说是安全的。