<p>正如我前面所说,<code>list(empty)</code><em>确实创建了一个新列表,但是这个新列表的内部列表只是对<code>empty</code>中相同列表对象的引用</p>
<p>您可以<em>使用<a href="https://docs.python.org/3/library/copy.html#copy.deepcopy" rel="nofollow noreferrer">^{<cd3>}</a>,但我认为在需要时构建新列表更简单。<code>deepcopy</code>函数跳过各种环,这些环是复制可以包含任何内容的任意深度嵌套对象所必需的。但是,当你有一个简单的从头开始构建的结构时,为什么还要费心去做这些事情呢</p>
<p>使用列表理解,您的代码可以这样编写:</p>
<pre><code>status["a"] = [[False] * 2 for _ in range(2)]
status["b"] = [[False] * 2 for _ in range(2)]
#etc
</code></pre>
<p>对最里面的列表执行<code>[False] * 2</code>是安全的:共享不可变对象(布尔、整数、字符串等)总是安全的。只有当您意外地共享一个可更改的对象,并且您更改了它的值而不是用新对象替换它时,问题才会出现</p>
<p>为了避免重新编写列表comp,可以使用函数为您构建列表。例如</p>
<pre><code>def empty(rows, columns):
return [[False] * columns for _ in range(rows)]
status = {key: empty(2, 2) for key in 'abc'}
print(status)
status["a"][0][0] = True
print(status)
</code></pre>
<p><strong>输出</strong></p>
<pre><code>{'a': [[False, False], [False, False]], 'b': [[False, False], [False, False]], 'c': [[False, False], [False, False]]}
{'a': [[True, False], [False, False]], 'b': [[False, False], [False, False]], 'c': [[False, False], [False, False]]}
</code></pre>