使用 [[]] * n 进行列表初始化时的列表链接问题
使用 [[]] 初始化列表列表时 n,程序员经常会遇到一个意想不到的问题,即列表似乎链接在一起。出现这种情况是因为 [x]n 语法创建对同一基础列表对象的多个引用,而不是创建不同的列表实例。
为了说明该问题,请考虑以下代码:
x = [[]] * 3 x[1].append(0) print(x)
这段代码的输出是:
[[0], [0], [0]]
而不是预期的输出:
[[], [0], []]
问题源于列表中的每个元素都是对同一列表对象的引用。当其中一个元素被修改时,所有其他元素都会受到影响。
要创建真正不同列表的列表,正确的方法是使用列表理解:
x = [[] for i in range(3)]
此语法为列表中的每个元素创建一个新的列表对象,确保它们是独立的。
以下代码作为演示:
In [20]: x = [[]] * 4
In [21]: [id(i) for i in x]
Out[21]: [164363948, 164363948, 164363948, 164363948] # same id()'s for each list,i.e same object
In [22]: x=[[] for i in range(4)]
In [23]: [id(i) for i in x]
Out[23]: [164382060, 164364140, 164363628, 164381292] #different id(), i.e unique objects this time
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3