嵌套列表索引
在Python中,可以使用列表列表创建嵌套列表。然而,当修改这些列表中的值时,由于 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>
预期输出是:
[0, 0, 0, 0] [0, 1, 1, 1] [0, 1, 1, 1] [0, 1, 1, 1]
然而,实际输出是:
[0, 1, 1, 1] [0, 1, 1, 1] [0, 1, 1, 1] [0, 1, 1, 1]
理解问题
问题源于 some_list = 4 * [(4 * [0 ])]。这里,[(4 * [0])] 表达式创建一个包含四个元素的列表,每个元素都是一个包含四个零的列表。然而,后续的乘法 4 * 创建了对同一列表的四个引用,而不是四个不同的列表。
因此,当修改 some_list 的一个元素内的值时,它也会影响其他元素,因为它们都指向同一个底层列表。这种行为在 Python 中称为引用传递。
解决方案
要解决此问题并在 some_list 中创建独立的列表,可以使用循环来单独创建每个子列表,如下所示:
<code class="python">some_list = [(4 * [0]) for _ in range(4)]</code>
此代码创建四个不同的列表,每个列表都有四个零。修改一个子列表中的值将不再影响其他子列表。
以上是为什么 Python 中的嵌套列表共享相同的基础数据?的详细内容。更多信息请关注PHP中文网其他相关文章!