You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:50:13