Python 列表是可变对象,因此当您这样做时,[[1]]*20
它会创建一个列表对象[1]
,然后将 20 个对它的引用放在顶级列表中。
就可变性问题而言,这与以下相同
a = [1,2,3]
b = a
b.append(4)
a # [1,2,3,4]
发生这种情况是因为仅将列表实例的引用b=a
从复制到。他们都指的是同一个实际列表。a
b
为了创建列表列表,就像您在上面尝试的那样,您需要为每个条目创建一个唯一列表。列表推导效果很好:
mainlist = [[1] for x in range(20)]
mainlist[0].append(2)
mainlist # [[1,2],[1],[1],...]
编辑
顺便说一句,由于类型名称是 Python 中的元类,因此用类型名称命名变量是个坏主意。原因是这可能会在代码中进一步导致几个问题:
a = range(3) # [0,1,2]
type(a) # (type 'list')
isinstance(a, list) # True
现在,创建一个名为list
list = range(3)
list # [0,1,2]
isinstance(list, list)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
更不用说,现在你不能使用list()
运算符
c = list((1,2,3))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable