python中的坑
2023-08-25 本文已影响0人
乔一波一
两种初始化二维列表的方式
第一种正确的
dp = [[0] * (b + 1) for _ in range(len(nums))]
print(dp)
for i in range(len(nums)):
dp[i][0] = 0
for j in range(b + 1):
if j >= nums[0]:
dp[0][j] = nums[0]
print(dp)
此时打印的结果是正常的:
正确初始化方式
第二种错误的
dp = [[0] * (b + 1)] * len(nums)
print(dp)
for i in range(len(nums)):
dp[i][0] = 0
for j in range(b + 1):
if j >= nums[0]:
dp[0][j] = nums[0]
print(dp)
此时打印的结果是错误的:
错误初始化方式
原因
在 Python 中,当你使用 [value] * n 创建一个列表时,这个列表中的每个元素实际上都指向同一个对象 value。这意味着在你的代码中,所有的子列表都引用同一个 [0, 0, 0, ..., 0] 列表。因此,如果你修改其中一个子列表的值,其他子列表也会受到影响,因为它们实际上引用的是相同的对象。应该使用列表推导或循环来逐个创建新的子列表,以确保每个子列表都是独立的对象,而不是共享同一个对象。