Python流程控制异常?DP背包问题代码数组行同步修改原因求助
问题分析:DP数组多行同步修改的原因与解决办法
你遇到的这个奇怪现象,根源是Python里列表乘法的一个常见陷阱——引用复用,咱们来拆解清楚:
为什么所有行都会同步变化?
你创建DP数组的代码是:
dp = [[False] * (run_sum+1)] * (n+1)
这里的* (n+1)并没有生成n+1个独立的子列表,而是让这n+1个位置都指向同一个子列表对象。打个比方,就像你复制了n+1个指向同一个房间的钥匙,不管用哪把钥匙开门修改房间里的东西,其他钥匙打开的都是同一个房间,自然看到的变化是一样的。
用一个简单的例子就能验证这个逻辑:
row = [False, False] dp = [row] * 3 dp[0][0] = True print(dp) # 输出 [[True, False], [True, False], [True, False]]
修改第一行的元素后所有行都跟着变,就是因为它们共享同一个子列表引用。
怎么修复这个问题?
要创建真正独立的多行数组,得用列表推导式,让每一行都单独生成:
dp = [[False]*(run_sum+1) for _ in range(n+1)]
这个写法会循环n+1次,每次都新建一个[False]*(run_sum+1)的列表,这样每一行都是完全独立的对象,修改某一行就不会影响其他行了。
把你代码里的DP数组创建换成这个写法后,再运行就能看到只有i=1的行被修改,其他行保持初始状态,完全符合你原本的DP逻辑预期。
额外小提示
你的代码里外层循环写的是range(1, 2),也就是只执行了i=1这一次循环,应该是你用来测试的临时代码吧?后续如果要完成完整的背包问题逻辑,记得把循环改成range(1, n+1)哦。
内容的提问来源于stack exchange,提问作者YoshiZ
相关产品推荐
相关产品推荐

