Python二维列表赋值异常:为何无法按预期完成赋值?
Python列表赋值不符合预期的问题解析
问题代码
a=[[1],[2,3],[4,5,6]] dp=[[0]*3]*3 dp[0][0]=a[0][0] for i in range(1,3): for j in range(0,len(a[i])): if j==0: dp[i][j]=dp[i-1][j]+a[i][j] for i in range(3): for j in range(3): print(dp[i][j])
实际输出
7 0 0 7 0 0 7 0 0
预期输出
1 0 0 3 0 0 7 0 0
问题根源
问题出在dp=[[0]*3]*3这行初始化代码上。这种写法并没有创建3个独立的长度为3的子列表,而是创建了1个长度为3的列表,然后让dp的3个元素都指向这个列表的引用。也就是说,dp[0]、dp[1]、dp[2]是同一个列表对象的别名,修改其中任意一个子列表的元素,另外两个都会跟着变化。
直观来说:当你执行dp[1][0] = dp[0][0]+2时,因为dp[1]和dp[0]指向同一个列表,这行代码同时把dp[0][0]改成了3;接着循环到i=2时,dp[2][0] = dp[1][0]+4,此时dp[1][0]已经是3,计算后得到7,这又会同时把dp[0][0]和dp[1][0]都改成7,最终所有子列表的第一个元素都是7。
解决方法
改用列表推导式初始化dp,确保每个子列表都是独立的对象:
a=[[1],[2,3],[4,5,6]] # 用列表推导式创建独立子列表 dp=[[0]*3 for _ in range(3)] dp[0][0]=a[0][0] for i in range(1,3): for j in range(0,len(a[i])): if j==0: dp[i][j]=dp[i-1][j]+a[i][j] for i in range(3): for j in range(3): print(dp[i][j])
执行这段代码后,输出就会和预期一致:
1 0 0 3 0 0 7 0 0
内容的提问来源于stack exchange,提问作者user17225291
相关产品推荐
相关产品推荐

