<p>我觉得你把事情弄得太复杂了。您可以仅从任何单元格的索引中确定其正确值。给定大小<code>n</code>和行/列<code>[i,j]</code>,值为:</p>
<pre><code>max(abs(n - 1 - j) + 1, abs(n - 1 - i) + 1)
</code></pre>
<p>例如:</p>
<pre><code>def square(n):
arr = []
for i in range(n + n-1):
cur = []
arr.append(cur)
for j in range(n + n -1):
cur.append(max(abs(n - 1 - j) + 1, abs(n - 1 - i) + 1))
return arr
</code></pre>
<p>那么</p>
<pre><code>> square(3)
[[3, 3, 3, 3, 3],
[3, 2, 2, 2, 3],
[3, 2, 1, 2, 3],
[3, 2, 2, 2, 3],
[3, 3, 3, 3, 3]]
> square(5)
[[5, 5, 5, 5, 5, 5, 5, 5, 5],
[5, 4, 4, 4, 4, 4, 4, 4, 5],
[5, 4, 3, 3, 3, 3, 3, 4, 5],
[5, 4, 3, 2, 2, 2, 3, 4, 5],
[5, 4, 3, 2, 1, 2, 3, 4, 5],
[5, 4, 3, 2, 2, 2, 3, 4, 5],
[5, 4, 3, 3, 3, 3, 3, 4, 5],
[5, 4, 4, 4, 4, 4, 4, 4, 5],
[5, 5, 5, 5, 5, 5, 5, 5, 5]]
</code></pre>
<p><strong>编辑</p>
<p>当前代码的问题是:</p>
<pre><code>sideAdd = [val] * n
arr.insert(0, sideAdd)
arr.append(sideAdd)
</code></pre>
<p>两次添加对<em>相同</em>数组(<code>sideAdd</code>)的引用。因此,稍后添加列时:</p>
<pre><code>arrx[i].insert(0, val)
arrx[i].append(val)
</code></pre>
<p>如果这两个数组是在前面的循环中添加的,那么它们是相同的。添加到第一个数组也会将一个数组添加到第二个数组,添加到第二个数组会将一个数组添加到第一个数组。所以你最后做了两次。有几种方法可以解决这个问题,但最简单的方法是第二次添加副本:</p>
<pre><code>sideAdd = [val] * n
arr.insert(0, sideAdd)
arr.append(sideAdd[:]) # Make a copy — don't add the same reference
</code></pre>