重访嵌套列表索引
在 Python 中,嵌套列表提供了一种组织数据的便捷方式。然而,使用这些列表的索引有时会导致意外的结果。让我们通过特定的代码示例探讨与嵌套列表索引相关的常见问题:
考虑以下代码片段:
<code class="python">some_list = 4 * [(4 * [0])] for i in range(3): for j in range(3): some_list[i+1][j+1] = 1 for i in range(4): print(some_list[i])</code>
预期目标是创建一个 2D 列表,其中值位于每个索引(不包括第一行和第一列)都设置为 1。但是,代码未能实现此目的。相反,它会生成一个列表,其中所有行和列都填充 1。
说明:
此问题的根本原因在于 Python 传递列表的方法参考。与基本值类型不同,列表作为对同一内存位置的引用传递。这意味着对一个列表变量所做的任何更改都将反映在引用同一列表的所有其他变量中。
在给定的代码中,行 some_list = 4 * [(4 * [0])] 乘以列表四次包含单个 0 值。但是,它不会创建四个不同的列表。相反,它会创建一个列表,其中有四个引用指向相同的 0 值。
因此,当代码在循环的第一次迭代中更新 [i 1][j 1] 处的值时,它修改所有其他引用指向的值。这解释了为什么所有元素最终的值为 1。
解决方案:
要解决此问题并创建四个不同的列表,每个列表都有自己的一组值,有必要避免第二次乘法。一种方法是使用循环分别初始化列表的每一行:
<code class="python">some_list = [(4 * [0]) for _ in range(4)]</code>
通过循环 range(4),此代码创建四个不同的列表,每个列表都有一组单独的值。因此,后续对列表值的修改不会影响其他行。
以上是为什么在 Python 中修改嵌套列表会导致意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!