假设我在Python中有以下空的二维数组:
q = [[None]*5]*4
我想将5
的值分配给q
第一列的第一行。本能地,我做了以下几点:
q[0][0] = 5
但是,这会产生:
[[5, None, None, None, None],
[5, None, None, None, None],
[5, None, None, None, None],
[5, None, None, None, None]]
每个数组的第一个元素被初始化为5
,我认为只有第一个数组的第一个元素才能获得更新。我有两个问题:
答案 0 :(得分:47)
这不符合您的期望。
q = [[None]*5]*4
它多次重用list
个对象。正如您所看到的那样,您对一个单元格进行了更改,该单元格位于重用的列表对象中。
值为[None]
的单个列表使用了五次。
值为[[None]*5]
的单个列表使用了四次。
q = [ [ None for i in range(5) ] for j in range(4) ]
可能更多你正在寻找的东西。
这明确避免重用列表对象。
80%的时间,字典是你真正想要的。
q = {}
q[0,0]= 5
也会奏效。您不能从预定义的None
值网格开始。但是首先需要它们是罕见的。
在Python 2.7及更高版本中,您可以这样做。
q = { (i,j):0 for i in range(5) for j in range(4) }
这将构建一个由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}
答案 1 :(得分:8)
你之所以有这个清单,只是重复了四次!每次执行*4
时,Python都不会重新生成该列表。它使用相同的列表对象。
要解决这个问题,你需要强制python每次为你重新生成该列表:
[ [None] * 5 for i1 in range(4) ]
在这种情况下,我正在使用列表理解。
答案 2 :(得分:4)
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)
结果:
[[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]]
答案 3 :(得分:1)
答案很简单从不使用
q = [[None]*5]*4
与分配时一样
q[0][1]=5
它将值多次分配给1列的多行
尝试打印(q)
宁愿使用
q = { (i,j):0 for i in range(5) for j in range(4) }
然后q[0][1]=5
将只分配一次
试试
print(q)
答案 4 :(得分:0)
为什么Python初始化每个数组的第一个值而不仅仅是第一个?
因为它们是同一个数组,所以多次引用。
有没有更好的方法来完成我想要做的事情?
创建结构,使外部数组引用单独的内部数组,而不是重用一个。其他答案提供了这样做的方法。
答案 5 :(得分:0)
如果您想使用列表而不是其他人建议的字典,您可以使用:
q[0] = [5,None,None,None,None]
答案 6 :(得分:0)
问题2的答案: 使用numpy是一种选择。请参阅以下代码。
import numpy as np
# creating 2D array with nans
num_of_rows = 5
num_of_cols = 3
a = np.full((num_of_rows, num_of_cols), np.nan)
#for zero vals: a = np.zeros((num_of_rows, num_of_cols))
# placing number 5 in row 3, col 1
value = [5]
position_row = 3
position_col = 1
# the put command below flattens the 2D array
position = [int(num_of_cols * position_row + position_col)]
np.put(a, position, value)
结果:
[[ nan nan nan]
[ nan nan nan]
[ nan nan nan]
[ nan 5. nan]
[ nan nan nan]]