Python求解Leetcode 3Sum时列表出现意外修改问题咨询
问题成因
该现象是Python可变对象的引用传递特性导致的,并非列表的异常行为,具体逻辑如下:
- Python中的列表属于可变对象,对列表进行赋值操作时,默认传递的是指向内存中列表实体的引用,而非重新拷贝一份列表内容。
- 第一个双层循环中存入
sum字典的value都是独立的列表对象,例如key为1对应的列表是[-1, 2],sum[1]仅为指向该列表的引用。 - 第二个循环执行
temp = sum[-nums[i]]时,temp和sum中存储的列表指向同一块内存空间,对temp的修改会直接作用到原列表上。 - 第一次匹配到key为1的场景时,对
temp执行append(-1)后列表变为[-1, 2, -1],符合长度要求被加入result,此时result[0]同样指向该列表实体。 - 后续循环再次匹配到key为1时,又对同一个列表执行
append(-1),列表变为[-1, 2, -1, -1],因长度超过3不会被再次加入result,但原列表已经被修改。由于result[0]和该列表是同一引用,最终打印result时第一个元素就会显示为修改后的值。
如果要避免该问题,可以在将列表加入result时进行浅拷贝,改为result.append(temp.copy())即可。
内容的提问来源于stack exchange,提问作者Prithiviraj
相关产品推荐
相关产品推荐

