Python 列表是可变对象,因此当您执行 [[1]]*20 时,它会创建 一个 列表对象 [1],然后将 20 个对它的引用放在顶级列表中。
就可变性问题而言,和下面是一样的
a = [1,2,3]
b = a
b.append(4)
a # [1,2,3,4]
发生这种情况是因为b=a 只是将 reference 从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