嵌套列表突变:了解意外行为
在 Python 中,可变数据结构(例如列表)在嵌套时可能会出现意外行为。考虑创建列表列表的示例:
xs = [[1] * 4] * 3
这会初始化一个嵌套列表结构,其中每个子列表包含四个设置为 1 的元素。但是,修改这些最里面的值之一,如下所示:
xs[0][0] = 5
影响每个子列表的所有第一个元素,结果位于:
[[5, 1, 1, 1], [5, 1, 1, 1], [5, 1, 1, 1]]
意外行为的原因
问题的根源在于 * 运算符应用于对象时的工作方式。在本例中,行:
[[1] * 4] * 3
创建对同一子列表 [1] 4 的三个引用,而不是创建三个独立的副本。这是因为 对表达式 [1] * 4 的求值结果进行运算,该结果是单个子列表。因此,对此单个子列表的任何更改都会反映在所有引用中。
解决问题
要创建独立的子列表,有必要强制对[1] * 每个子列表有 4 个表达式。这可以使用列表理解来实现,如下所示:
[[1]*4 for _ in range(3)]
在这种情况下,每次都会评估 [1]*4 表达式,从而创建三个不同的子列表以及任何更改到一个子列表只会影响该子列表,而不影响其他子列表。
以上是为什么在 Python 中修改嵌套列表会意外影响所有子列表?的详细内容。更多信息请关注PHP中文网其他相关文章!