擅长:python、mysql、java
<p>根据我对Ned Batchelder的回答的评论,下面是你如何做到一成不变:</p>
<pre><code>for i in range(len(p)):
for j in range(len(p[i])):
temprow = [0 if y==j else p[i][y] for y in range(len(p[i]))]
temp = [temprow if x==i else p[x] for x in range(len(p))]
init_q.append(temp)
</code></pre>
<p>在这种情况下,我认为结果比他的建议可读性差得多:</p>
^{pr2}$
<p>就像我说的,有时候它会让事情变得简单,有时候会让事情变得不那么简单……但关键是它更容易推理。您不必担心<code>init_q</code>中的多个<code>list</code>,或者更糟的是,这些<code>list</code>中的子<code>list</code>是否共享身份。在</p>
<p>权衡是否值得,这实际上是一个具体情况的决定,可能每个程序员都不同。在这种情况下,我不会使用不可变的解决方案,而且我怀疑许多其他(Python)程序员会这样做。但知道怎么写是值得的。在</p>
<p>您还可以考虑将其作为3D列表而不是2D列表的deque,然后将其输入<code>deque</code>。这显然是等价的,但从概念上来说,这样想可能更简单:</p>
<pre><code>init_q.append(p)
q = [copy.deepcopy(p) for i in range(len(p)) for j in range(len(p[i]))]
for i in range(len(p)):
for j in range(len(p[i])):
q[i*len(p[i])+j][i][j] = 0
init_q.extend(q)
</code></pre>
<p>PS,如果你做了很多这样的事情,你可以看看<a href="http://www.numpy.org" rel="nofollow">^{<cd6>}</a>。如果这就是你的全部问题,对你没有任何好处…但是如果你用多维数组做更复杂的事情,它会的。在</p>