为何使用append()向列表L添加SL时会出现覆盖现象?
嘿,我来帮你捋清楚这个问题!你遇到的这个情况,本质是Python里可变对象的引用机制在搞鬼。
你看,你全程一直在用同一个SL列表,每次循环里只是清空它再重新加元素。但当你执行L.append(SL)的时候,你并没有把SL当前的内容复制一份放进L,而是把SL这个列表本身的引用存进了L里。也就是说,L里的所有元素其实都指向同一个内存地址的列表。后面你每次修改SL(清空、加新值),L里所有指向它的元素都会跟着变,到最后循环结束,SL是最后一次的结果,那L里自然全是这个结果了。
至于你用extend()的情况,它会把SL里的每个元素单独添加到L中,相当于把[i,j,k]拆成i、j、k三个元素塞进去,所以最后L就变成一维的整数列表了,这肯定不是你要的嵌套列表结构。
下面给你几个解决办法:
1. 每次循环创建新列表(最直观)
别复用SL了,每次符合条件的时候直接生成一个新的列表,这样每个加到L里的都是独立的对象,互不影响:
if __name__ == '__main__': x = int(input()) y = int(input()) z = int(input()) n = int(input()) L = [] for i in range(x + 1): for j in range(y + 1): for k in range(z + 1): if i + j + k != n: L.append([i, j, k]) print(L)
2. 用列表推导式(符合题目考点,最简洁)
这题本来就是考列表推导式的,用一行代码就能搞定,还能彻底避免引用问题:
if __name__ == '__main__': x = int(input()) y = int(input()) z = int(input()) n = int(input()) L = [[i, j, k] for i in range(x+1) for j in range(y+1) for k in range(z+1) if i + j + k != n] print(L)
3. 复制SL的副本再添加(如果非要复用SL)
如果你坚持要用SL这个变量,那每次append的时候记得复制它的副本,比如用SL.copy()或者切片SL[:]来生成新列表:
if __name__ == '__main__': x = int(input()) y = int(input()) z = int(input()) n = int(input()) L = [] SL = [] for i in range(x + 1): for j in range(y + 1): for k in range(z + 1): if i + j + k != n: SL.clear() # 用clear()比SL[:]=[]更直观 SL.extend([i, j, k]) L.append(SL.copy()) # 添加副本 print(L)
这样每个放进L里的都是独立的列表,后续修改SL也不会影响已经存在于L中的元素啦。
内容的提问来源于stack exchange,提问作者loksoni
相关产品推荐
相关产品推荐

