对Python列表使用乘法,对于不可变对象(如数字、字符串)而言是复制值,但对可变对象(如列表、字典)而言则是复制引用,因此对于包含可变对象的列表切莫使用列表乘法,可使用列表生成式代替。
?来自https://ask.csdn.net/questions/7479175?spm=1001.2014.3001.5506
具体例子如下:
>>> import numpy as np
>>> a,b = [np.ones(2)]*2
>>> a+=1
>>> a
array([2., 2.])
>>> b
array([2., 2.])
改变a的值也会改变b的值,这是因为列表乘法是引用,所以a,b指向同一个对象
>>> id(a)
2527488770960
>>> id(b)
2527488770960
使用列表生成式
>>> a,b = [np.ones(2) for i in range(2)]
>>> a
array([1., 1.])
>>> b
array([1., 1.])
>>> id(a)
2527489591600
>>> id(b)
2527489591504
PS. a=a+1与a+=1的不同
>>> a, b = [np.ones(2)]*2
>>> id(a)
2527488770960
>>> a+=1
>>> id(a)
2527488770960
>>> a=a+1
>>> id(a)
2527489591600
?a+=1是就地(in-place)运算,不改变a的id
a=a+1改变a的id
PS:
a*b等价于a.__mul__(b)
a+=b 几乎等价于a.__iadd__(b)
https://stackoverflow.com/questions/4841436/what-exactly-does-do-in-python
|