python初始化列表的一个小细节
今天用python写算法的时候注意到python初始化list的一个小细节
当我们想得到一个长度为n的列表时,一般可以
l = [0 for i in range(n)
# or
l = [0]*n
对于第二种方式要注意的是,如果数组元素是引用类型(比如对象,string等),那么这个list中每个元素保存的都是相同的引用
a = object()
l = [a]*2
id(l[0])==id(l[1]) # turn out True
所以如果想得到一个m行n列的二维数组,一定要小心,不能如下初始化
n = 3
m = 3
l = [[0]*n]*m
l[0][1] = 1
l[1][1]==1 # trun out True!!
所以还是老老实实的初始化吧
l = [[0 for _ in range(n)] for _ in range(m)]