为什么追加覆盖列表?

时间:2018-05-25 16:02:41

标签: python python-3.6

我正在尝试来自hackerrank的一些问题并遇到了这个问题 https://www.hackerrank.com/challenges/list-comprehensions/problem

我试过这个解决方案

if __name__ == '__main__':
x = int(input())
y = int(input())
z = int(input())
n = int(input())
L = []
SL = []
for i in range(0, x + 1):
    for j in range(0, y + 1):
        for k in range(0, z + 1):
            if i + j + k != n:
                SL[:] = []
                SL.append(i)
                SL.append(j)
                SL.append(k)
                print(SL)
                L.append(SL)
print(L)

虽然SL有正确的解决方案但由于某种原因我不能将SL附加到主列表L,并且显然L.append(SL)在每次执行时都会覆盖列表L,因为它会打印SL的最后一个值。 为什么会这样? 我尝试使用extend,但它不是使它成为列表列表,而是创建为一个整数列表。 编辑:谢谢大家的解释!

2 个答案:

答案 0 :(得分:2)

确实,您的代码不起作用,这是由于行position: absolute:它会更改SL[:] = []引用的列表的内容。通过这样做,您可以更改SL的所有元素,因为您始终会将L引用的列表附加到循环中的SL。用L替换将解决问题,因为在这种情况下,您创建一个新列表而不会覆盖前一个列表。
它可以修复,并且更易于阅读(如果需要),并提供以下建议:

SL = []

x = 1,y = 2,z = 3,n = 4:它给出了以下输出:

L = []
for i in range(0, x + 1):
    for j in range(0, y + 1):
        for k in range(0, z + 1):
            if i + j != n and i + k != n and k + j != n and i + j + k != n:
                L.append([i, j, k])
print(L)

答案 1 :(得分:0)

此行通过删除所有项目来清除列表。该列表保持相同的变量(相同的对象),只修改其内容:

SL[:] = []

稍后在代码中就是这一行(在一个循环中):

L.append(SL)

但SL每次都是相同的变量。 L中的所有项目都引用相同的列表SL。因此,在修改SL时,L中的所有项目都会引用SL的新内容。

这可以通过为每个结果创建一个新列表来解决。