如何 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会帮助你理解。
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会帮助你理解。