Py学习  »  Python

列表中的Python运算符星号[重复]

Mustafa Mahmod • 5 年前 • 1456 次点击  

为什么这里的输出是[2,1][ 2个 1个 ,1]]

a = [[1] * 2] * 2
a[0][0]=2
print (a)

我对列表中的*运算符做了大量的研究,但似乎没有得到正确的理解

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/55533
 
1456 次点击  
文章 [ 3 ]  |  最新文章 5 年前
blueteeth
Reply   •   1 楼
blueteeth    5 年前

当你这样做的时候,你只是创建列表的副本,n次。

所以这里的内部列表实际上是相同的列表。当你修改第一个时,你也在修改第二个。如果不需要该功能,可以执行以下操作:

a = [[1 for _ in range(2)] for _ in range(2)]
iamnifer
Reply   •   2 楼
iamnifer    5 年前

当您通过将列表相乘来创建列表时,您正在创建从一个列表到另一个列表的链接。换句话说,乘法列表是相同的列表,但显示多次。

tanksapka
Reply   •   3 楼
tanksapka    5 年前

这是因为Python如何处理内存中的对象。当您使用 * 2 要复制列表,Python不会在内存中创建单独的列表对象,它只复制第二个列表位置的内存指针。由于第一个元素发生变异时的这种行为,它也会影响第二个元素。 你可以使用 id() 函数检查Python中的对象id。你会看到的 a[0] a[1] 会有相同的身份证。

>>> a = [[1] * 2] * 2
>>> a[0][0] = 2
>>> a
[[2, 1], [2, 1]]
>>> id(a[0])
140608840898432
>>> id(a[1])
140608840898432
>>> id(a[0]) == id(a[1])
True