所以我对Python比较陌生,我在使用2D列表时遇到了麻烦。
这是我的代码:
data = [[None]*5]*5
data[0][0] = 'Cell A1'
print data
,这是输出(为便于阅读而格式化):
[['Cell A1', None, None, None, None],
['Cell A1', None, None, None, None],
['Cell A1', None, None, None, None],
['Cell A1', None, None, None, None],
['Cell A1', None, None, None, None]]
为什么每一行都被分配了值?
答案 0 :(得分:66)
这会产生一个列表,其中包含对相同列表的五个引用:
data = [[None]*5]*5
使用类似这样的内容来创建五个单独的列表:
>>> data = [[None]*5 for _ in range(5)]
现在它符合您的期望:
>>> data[0][0] = 'Cell A1'
>>> print data
[['Cell A1', None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None]]
答案 1 :(得分:14)
由于python library reference for sequence types包含列表,所以
另请注意,副本很浅;嵌套结构不会被复制。这常常困扰着新的Python程序员;考虑:
>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]
发生的事情是[[]]是一个包含空列表的单元素列表,因此[[]] * 3的所有三个元素都是(指向)这个空列表。修改列表的任何元素都会修改此单个列表。
您可以通过以下方式创建不同列表的列表:
>>> lists = [[] for i in range(3)]
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
[[3], [5], [7]]
答案 2 :(得分:2)
在python中,每个变量都是一个对象,因此是一个引用。您首先创建了一个包含5个Nones的数组,然后使用相同对象的5倍构建一个数组。