<p>所以实际的问题是您正在创建一个字典<code>cols</code>重复的列表<code>{}</code>。在</p>
<pre><code>a = [{}]*3
b = [{} for _ in range(3)]
print(id(a[0]), id(a[1]), id(a[2])) # returns 3 times the same identity
print(id(b[0]), id(b[1]), id(b[2])) # returns 3 different identities
</code></pre>
<p>问题是乘法运算符<code>*</code>被定义来处理对象。因此,首先计算表达式,然后乘以对象。在理解中,表达式在每次迭代时都要求值。在</p>
<p><code>*</code>运算符不知道对象内部有一个表达式和/或要复制它的任何部分。因此,它生成对同一对象的引用,而不是创建新对象。
乘法运算符的这种行为是语言设计的一个基本部分,因此,我们这些Python用户必须适应使用它。在</p>
<p>顺便说一下,<code>rows</code>和<code>cols</code>定义也是如此。在</p>
^{pr2}$
<p>但是,由于整数是不可变的,因此如果重新定义<code>rows</code>,就不会改变<code>cols</code></p>
^{3}$
<p>但是,如果您使用可变对象,那么您将得到与当前字典列表中类似的行为问题:</p>
<pre><code>rows = cols = {}
rows.update({1: 'a'})
print(rows, cols) #{1: 'a'} {1: 'a'}
</code></pre>
<p>现在,这让我们在寻求让您的字典按照您希望的方式更新的过程中有何进展(我随意修改了一些我认为多余的代码部分):</p>
<pre><code>rows=cols=10
for i in range(rows):
Q.append([{} for _ in range(cols)])
for x in range(cols):
Q[x][i][Direction.up]=0
Q[x][i][Direction.down]=0
Q[x][i][Direction.left]=0
Q[x][i][Direction.right]=0
x=5
y=2
Q[x][y][Direction.right]=22
for x in range(cols):
for y in range(rows):
print(x, ' ', y, '\n', Q[x][y], '\n', sep='')
print("\n")
</code></pre>