刷力扣时踩的坑
list1 = [] * (n)
list2 = [[] for _ in range(n)]
`在 Python 中产生的结果不同
1.
[] * (n)
这会创建一个包含 `n` 个相同空列表的列表。这意味着它会复制空列表 `n` 次,以创建一个包含这些复制的新列表。这些复制的列表都是相同的对象,因此如果你修改一个列表,其他的也会随之改变,因为它们都引用相同的对象。
例如,如果你执行以下代码:
n = 3
my_list = [[]] * (n)
my_list[0].append(1)
print(my_list)
输出将是 `[[1], [1], [1], [1]]`,因为它们引用了相同的空列表。
2.
[[] for _ in range(n)]
这会创建一个包含 `n` 个不同空列表的列表。每个内部的空列表都是一个独立的对象,因此修改其中一个不会影响其他的列表。
例如,如果你执行以下代码:
n = 3
my_list = [[] for _ in range(n)]
my_list[0].append(1)
print(my_list)
输出将是 `[[1], [], [], []]`,因为每个内部的空列表都是独立的对象。
总之,区别在于第一个方法创建的列表中的元素都是相同的对象,而第二个方法创建的列表中的元素都是独立的对象。
3.
[1] * n
这会创建一个包含 n
个相同的元素为 1
的列表。这意味着所有的元素都是相同的整数对象,修改其中一个不会影响其他的列表。
例如,如果你执行以下代码:
n = 3
my_list = [1] * (n + 1)
address1 = id(my_list[0])
address2 = id(my_list[1])
print(f"The memory address of my_list[0] is: {address1}")
print(f"The memory address of my_list[1] is: {address2}")
# 对其中一个元素进行修改
my_list[0] = 2
address1 = id(my_list[0])
address2 = id(my_list[1])
address3 = id(my_list[2])
print(f"The memory address of my_list[0] is: {address1}")
print(f"The memory address of my_list[1] is: {address2}")
print(f"The memory address of my_list[2] is: {address3}")
print(my_list)
# 运行结果
The memory address of my_list[0] is: 140729221738768
The memory address of my_list[1] is: 140729221738768
The memory address of my_list[0] is: 140729221738800
The memory address of my_list[1] is: 140729221738768
The memory address of my_list[2] is: 140729221738768
[2, 1, 1, 1]
虽然所有的元素都是相同的整数对象,但你可以修改其中一个元素而不影响其他元素