我们经常使用*来初始化一个列表,比如:
l=[1,2,3]
l*3
#[1, 2, 3, 1, 2, 3, 1, 2, 3]
如果在 a * n 这个语句中, 序列 a 里的元素是对其他可变对象的引用的话,你就需要格外注意了, 因为这个式子的结果可能会出乎意料。 比如, 你想用my_list = [[]] * 3 来初始化一个由列表组成的列表, 但是你得到的列表里包含的 3 个元素其实是 3 个引用, 而且这 3 个引用指向的都是同一个列表。
看2个例子
例1:
l=[['-']*3 for i in range(3)]
print(l)
l[0][0]=9
print(l)
#[['-', '-', '-'], ['-', '-', '-'], ['-', '-', '-']]
#[[9, '-', '-'], ['-', '-', '-'], ['-', '-', '-']]
例2:
a=[['-']*3]*3
print(a)
a[0][0]=9
print(a)
#[['-', '-', '-'], ['-', '-', '-'], ['-', '-', '-']]
#[[9, '-', '-'], [9, '-', '-'], [9, '-', '-']]
例2出错的原意就在于list[['-']*3]
的元素是可变对象的引用
例2相当于每次都追加同一个对象(row
)到a
里
row=['-']*3
a=[]
for i in range(3):
a.append(row)
print(a)
a[0][0]=9
print(a)
#[['-', '-', '-'], ['-', '-', '-'], ['-', '-', '-']]
#[[9, '-', '-'], [9, '-', '-'], [9, '-', '-']]
例1相当于每次新建一个row
加到了l
里
l=[]
for i in range(3):
row=['-']*3
l.append(row)
print(l)
l[0][0]=9
print(l)
#[['-', '-', '-'], ['-', '-', '-'], ['-', '-', '-']]
#[[9, '-', '-'], [9, '-', '-'], [9, '-', '-']]
参考:流畅的python