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,我认为只有第一个数组的第一个元素才能获得更新.我有两个问题:
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)
你之所以有这个清单,只是重复了四次!每次执行时,Python都不会重新生成该列表*4.它使用相同的列表对象.
为了解决这个问题,你需要强制python每次为你重新生成该列表:
[ [None] * 5 for i1 in range(4) ]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我正在使用列表理解.
答案很简单 从不使用
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)
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)
| 归档时间: |
|
| 查看次数: |
41990 次 |
| 最近记录: |