如何 python [0] * 3 是独立的但 [[0] * 3] * 3 每个子列表是同一个对象?

how python [0] * 3 are independent but [[0] * 3] * 3 each sub list is the same object?

my_list = [0] * 3
my_list[0] = 1

输出到 [1, 0, 0]

my_2ndlist = [[0] * 3] * 3
my_2ndlist[1][1] = 5

输出到 [[0, 5, 0], [0, 5, 0], [0, 5, 0]]

我想我知道 x = 1 y = 1 使 x 和 y 指向内存中的相同位置。 所以我了解了第二个输出,即使它不是我认为您所期望的。 但是后来我没有完全得到第一个,因为我期望它仍然是对同一内存位置的引用的 3 倍。

有什么解释可以帮助我更好地理解吗?谢谢。

当您打印 my_list[0], my_list[1], my_2ndlist[0], my_2ndlist[1] 的地址时,您会看到 my_list[0], my_list[1] 有 2 个不同的地址,而 my_2ndlist[0], my_2ndlist[1] 有相同的地址。

my_list = [0] * 3
my_list[0] = 1
print(my_list)
print(id(my_list[0]), id(my_list[1]))

my_2ndlist = [[0] * 3] * 3
my_2ndlist[1][1] = 5
print(my_2ndlist)
print(id(my_2ndlist[0]), id(my_2ndlist[1]))

发生这种情况是因为 [0] * 3 将复制一个值为零的整数对象 3 次。在 python 中,当原始类型对象被复制时,它们被深度复制(整数是原始类型)。但是,[[0] * 3] * 3 这将复制列表 [0, 0, 0] 3 次。列表不是原始类型对象,因此它们是浅拷贝的。也许this link会帮助你理解。