2D列表在尝试修改单个值[重复]时具有怪异的遗迹
-
02-10-2019 - |
题
可能的重复:
列表列表中的意外功能
因此,我对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]]
为什么每行都会分配值?
解决方案
这列出了五个引用的列表 相同的 列表:
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]]
其他提示
作为 序列类型的Python库参考, ,其中包括列表,说
还请注意,副本很浅;嵌套结构未复制。这常常困扰着新的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]]
在Python中,每个变量都是一个对象,因此是参考。您首先创建了5个Nones的数组,然后构建一个数组,具有相同对象的5倍。
不隶属于 StackOverflow