首页 > 解决方案 > 为什么追加覆盖列表?

问题描述

我正在尝试来自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 的最后一个值。为什么会这样?我尝试使用扩展,但不是将其设为列表列表,而是将其创建为整数列表。编辑:谢谢大家的解释!

标签: pythonpython-3.6

解决方案


实际上,您的代码不起作用,这是由于该行SL[:] = []:它更改了引用的列表的内容SL。通过这样做,您更改了 的所有元素,因为您总是在循环中附加toL引用的列表。替换为将解决问题,因为在这种情况下,您会创建一个新列表而不会覆盖前一个列表。 它可以通过以下建议进行修复,并且更具可读性和更易于调试(如果需要):SLLSL = []

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)

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

[[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3], [0, 1, 0], [0, 1, 1], [0, 1, 2], [0, 2, 0], 
 [0, 2, 1], [0, 2, 3], [1, 0, 0], [1, 0, 1], [1, 0, 2], [1, 1, 0],  [1, 1, 1], [1, 2, 0]]

推荐阅读