在尝试修改单个值时,2D列表具有奇怪的行为

Bri*_*ian 51 python 2d list python-2.7

可能重复:
Python列表中的意外功能

所以我对Python比较新,我在使用2D列表时遇到了麻烦.

这是我的代码:

data = [[None]*5]*5
data[0][0] = 'Cell A1'
print data
Run Code Online (Sandbox Code Playgroud)

这是输出(为便于阅读而格式化):

[['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]]
Run Code Online (Sandbox Code Playgroud)

为什么每一行都被分配了值?

Mar*_*ers 74

这使得列表具有对同一列表的五个引用:

data = [[None]*5]*5
Run Code Online (Sandbox Code Playgroud)

使用类似这样的东西来创建五个单独的列表:

>>> data = [[None]*5 for _ in range(5)]
Run Code Online (Sandbox Code Playgroud)

现在它符合您的期望:

>>> 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]]
Run Code Online (Sandbox Code Playgroud)


use*_*019 15

作为序列类型python库引用,包括列表,说

还要注意副本很浅; 嵌套结构不会被复制.这常常困扰着新的Python程序员; 考虑:

>>> lists = [[]] * 3
>>> lists
  [[], [], []]
>>> lists[0].append(3)
>>> lists
  [[3], [3], [3]]
Run Code Online (Sandbox Code Playgroud)

发生的事情是[[]]是一个包含空列表的单元素列表,因此[[]]*3的所有三个元素都是(指向)这个空列表.修改列表的任何元素都会修改此单个列表.

您可以通过以下方式创建不同列表的列表:

>>> lists = [[] for i in range(3)]  
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
  [[3], [5], [7]]
Run Code Online (Sandbox Code Playgroud)