python - 为什么初始化列表列表的代码显然将列表链接在一起?

标签 python list

我打算初始化一个长度为 n 的列表。

x = [[]] * n

但是,这会以某种方式将列表链接在一起。

>>> x = [[]] * 3
>>> x[1].append(0)
>>> x
[[0], [0], [0]]

我希望有类似的东西:

[[], [0], []]

有什么想法吗?

最佳答案

问题是它们在内存中都是完全相同的列表。当你使用 [x]*n 语法时,你得到的是一个 n 许多 x 对象的列表,但它们都是引用到同一个对象。它们不是不同的实例,而只是 n 对同一实例的引用。

要列出 3 个不同的列表,请执行以下操作:

x = [[] for i in range(3)]

这为您提供了 3 个单独的 [] 实例,这正是您想要的

[[]]*n 类似于

l = []
x = []
for i in range(n):
    x.append(l)

[[] for i in range(3)] 类似于:

x = []
for i in range(n):
    x.append([])   # appending a new list!

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

关于python - 为什么初始化列表列表的代码显然将列表链接在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12791501/

相关文章:

C++ 列表实现

Python 2.7.7 包安装给出 Visual C++ cl.exe 错误 : command failed with exit status 2

python - Flask SERVER_NAME 永远不正确

python - 如何在 wxPython 静态文本小部件中显示插入符号?

python - 在 Python 中安装 re2 模块失败

python - 在Python中,有没有一种方法可以使用.format表示法将列表打印到字符串中?

python - SQLAlchemy 中的反射不适用于 MS SQL Server 系统表?

list - 如何在枚举列表中的项目之间放置数字?

python - 查找列表中的任何字符串元素是否包含在字符串列表中

list - Prolog-在列表中查找相邻元素