Python Can';我不明白为什么我总是得到一个“a”;列表索引超出范围“;错误。有人能帮我吗?

Python Can';我不明白为什么我总是得到一个“a”;列表索引超出范围“;错误。有人能帮我吗?,python,Python,我一直收到一个“列表索引超出范围”的错误,但不知道为什么。有人能帮忙吗 arr = [] if __name__ == '__main__': x = int(input()) y = int(input()) z = int(input()) n = int(input()) for x in range (x+1): for y in range(y+1): for z in range(z+1): arr.

我一直收到一个“列表索引超出范围”的错误,但不知道为什么。有人能帮忙吗

arr = []
if __name__ == '__main__':
    x = int(input())
    y = int(input())
    z = int(input())
    n = int(input())
for x in range (x+1):
    for y in range(y+1): 
        for z in range(z+1): 
            arr.append([x,y,z])
for i in range(len(arr)): 
    if (arr[i][0] + arr[i][1] + arr[i][2] == n): 
        del arr[i]
print(arr)

之所以会发生这种情况,是因为在遍历列表时,列表发生了变化。在您的特定示例中,实际上最好从旧列表创建一个新列表。在本例中:

arr = [x for x in arr if (x[0] + x[1] + x[2] != n)]

编辑:除了关于此活动相对于main的范围的注释之外。

最好建立一个这样的列表作为理解,这样您可以在构建列表时过滤元素,而不必返回并在事后尝试提取它们:

x, y, z, n = (int(input()) for _ in range(4))
arr = [
    [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
]

这是因为您迭代了数组的len,但len是在开始时计算和存储的,它不是更新。假设len 5的数组if,循环生成
0,1,2,3,4
,但是如果在循环过程中删除一项,当执行
arr[4]
时,它将失败


最好的解决方案是保留感兴趣的项目,而不是删除其他项目,无论是使用另一个数组还是列表。您还可以迭代数组的值,而不是索引

# new array
new_vals = []
for v in arr: 
    if sum(v) != n: 
        new_vals.append(v)

# list comprehension
arr = [v for v in arr if sum(v) != n]

您的意思是在
if u u name_u=='\ uuuuu main_uuu'
块下只包含部分代码吗?一般来说,删除使用范围迭代的数组项是一个坏主意:范围参数在开始时计算,但是循环中的列表变短了。在循环中修改列表通常是个坏主意。在这个特殊的例子中,列表在循环的中途变短了,但是你的循环将尝试在原始列表上迭代,所以它将结束。除了上面所说的,另一个要避免的做法是命名迭代器变量(在本例中,
x
y
z
,对于…
中的x,使用构建范围的变量的名称。另外,请注意,使用相同的变量作为索引和边界,如
对于范围内的x(x+1)
对可读性没有帮助,可能会导致一些错误-除了
y+1
z+1
之外的任何上限都会导致错误。