将值分配给二维python数组中的单个单元格

Ben*_*ack 30 python arrays list

假设我在Python中有以下空的二维数组:

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

我想为5第一列中的第一行赋值q.本能地,我做以下事情:

q[0][0] = 5
Run Code Online (Sandbox Code Playgroud)

但是,这会产生:

 [[5, None, None, None, None], 
  [5, None, None, None, None], 
  [5, None, None, None, None], 
  [5, None, None, None, None]]
Run Code Online (Sandbox Code Playgroud)

每个数组的第一个元素被初始化为5,我认为只有第一个数组的第一个元素才能获得更新.我有两个问题:

  1. 为什么Python初始化每个数组的第一个值而不仅仅是第一个?
  2. 有没有更好的方法来完成我想要做的事情?

S.L*_*ott 56

这不符合你的意愿.

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

list多次重用对象.正如您所看到的那样,您对一个单元格进行了更改,该单元格位于重用的列表对象中.

具有值的单个列表[None]使用五次.

具有值的单个列表[[None]*5]使用四次.

q = [ [ None for i in range(5) ] for j in range(4) ]
Run Code Online (Sandbox Code Playgroud)

可能更多你正在寻找的东西.

这明确避免重用列表对象.

80%的时间,字典是你真正想要的.

q = {}
q[0,0]= 5
Run Code Online (Sandbox Code Playgroud)

也会工作.您不是从预定义的None值网格开始.但首先需要它们是罕见的.

在Python 2.7及更高版本中,您可以执行此操作.

q = { (i,j):0 for i in range(5) for j in range(4) }
Run Code Online (Sandbox Code Playgroud)

这将构建一个由2元组索引的网格.

{(0, 1): 0, (1, 2): 0, (3, 2): 0, (0, 0): 0, (3, 3): 0, (3, 0): 0, (3, 1): 0, (2, 1): 0, (0, 2): 0, (2, 0): 0, (1, 3): 0, (2, 3): 0, (4, 3): 0, (2, 2): 0, (1, 0): 0, (4, 2): 0, (0, 3): 0, (4, 1): 0, (1, 1): 0, (4, 0): 0}
Run Code Online (Sandbox Code Playgroud)

  • 这是帕累托原则.http://en.wikipedia.org/wiki/Pareto_principle.80%的情况下,您只需要20%的数据结构. (5认同)
  • 如果你分享导致这个价值80%的研究,我会给你+1. (4认同)
  • @qkhhly:不,它对所有类型的行为都完全相同。您可以通过查看“[[id(x) for x in sublist] for sublist in q]”来确认所有引用都指向相同的 None。 (2认同)

Don*_*ner 9

你之所以有这个清单,只是重复了四次!每次执行时,Python都不会重新生成该列表*4.它使用相同的列表对象.

为了解决这个问题,你需要强制python每次为你重新生成该列表:

[ [None] * 5 for i1 in range(4) ]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我正在使用列表理解.


Jin*_*kur 5

答案很简单 从不使用

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

就像你做作业时一样

q[0][1]=5它将值多次分配给 1 列的多行尝试 print(q)

而是使用

q = { (i,j):0 for i in range(5) for j in range(4) }
Run Code Online (Sandbox Code Playgroud)

然后q[0][1]=5将只分配一次尝试

print(q)
Run Code Online (Sandbox Code Playgroud)


Jin*_*kur 5

q = [[None]*5]*4
print(q)
q[1][1]=4
print(q)
q = [ [ None for i in range(5) ] for j in range(4) ]
q[1][1]=4
print(q)
Run Code Online (Sandbox Code Playgroud)

结果:

[[None, None, None, None, None], [None, None, None, None, None], [None, None, None, None, None], [None, None, None, None, None]]
[[None, 4, None, None, None], [None, 4, None, None, None], [None, 4, None, None, None], [None, 4, None, None, None]]
[[None, None, None, None, None], [None, 4, None, None, None], [None, None, None, None, None], [None, None, None, None, None]]
Run Code Online (Sandbox Code Playgroud)