索引的值未更改为其应该的值(第9行)

时间:2017-02-09 04:44:11

标签: python

这是python3中的完整代码:

def rainwater(array):
    max_value = max(array)
    count = 0
    for a in range(0, max_value):
        temp = array
        for i in range(0, len(temp)):
            if temp[i] >= 1:
                print(temp)
                temp[i] = 1 # somehow this line always changes temp[i] to 0 instead of 1
                array[i] = array[i] - temp[i]

            array = temp

        for i in range(0, len(temp)):
            if temp[i] == 1:
                del temp[:i]
                break
        for i in range(0, len(temp) - 1, -1):
            if temp[i] == 1:
                del temp[i:]
                break
        if len(temp) <= 1:
            return count
        for i in range(0, len(temp)):
            if temp[i] == 0:
                count = count + 1
    return count


# driver program -> should return 6

print(rainwater([0,1,0,2,1,0,1,3,2,1,2,1]))

问题出现在第9行。不知道如何对这个问题进行分类,但我不能在我的生活中弄清楚这里缺少什么。提前谢谢。

2 个答案:

答案 0 :(得分:1)

问题

问题在于将temp指定为数组

使用temp = array,您实际上没有两个列表。赋值只是复制对列表的引用,而不是实际列表,因此temp和array在赋值后都引用相同的列表。

temp = array
for i in range(0, len(temp)):
    if temp[i] >= 1:
        print(temp)
        temp[i] = 1 # somehow this line always changes temp[i] to 0 instead of 1
        array[i] = array[i] - temp[i]

    array = temp

在上面的代码中,更改为temp[i]更改array[i], 所以

  temp[i] = 1                       # sets temp[i] = array[i]  = 1
  array[i] = array[i] - temp[i]     # array[i] = tempa[i] = 1-1

因此temp [i]为0而不是1

如何解决

您可以使用copydeepcopyslicing将数组复制到temp

以下是使用slicing

的更新代码

<强>代码

def rainwater(array):
    max_value = max(array)
    count = 0
    for a in range(0, max_value):
        temp = array[:]
        for i in range(0, len(temp)):
            if temp[i] >= 1:
                print(temp)
                temp[i] = 1 # somehow this line always changes temp[i] to 0 instead of 1
                array[i] = array[i] - temp[i]

            array = temp[:]

        for i in range(0, len(temp)):
            if temp[i] == 1:
                del temp[:i]
                break
        for i in range(0, len(temp) - 1, -1):
            if temp[i] == 1:
                del temp[i:]
                break
        if len(temp) <= 1:
            return count
        for i in range(0, len(temp)):
            if temp[i] == 0:
                count = count + 1
    return count


# driver program -> should return 6

print(rainwater([0,1,0,2,1,0,1,3,2,1,2,1]))

答案 1 :(得分:1)

此行将您的值设置为0:

array[i] = array[i] - temp[i]

原因是数组和temp是相同的对象。所以x - x总是为零。

我认为你假设第5行的代码会复制数组:

temp = array

但事实并非如此。这使temparray引用相同的数组。如果您确实需要数组的副本,请执行以下操作:

temp = array[:]

此外,如果您正在制作副本,您可能还想修复第11行。

我建议你阅读更多关于通过引用和值传递变量的信息。