2017-02-09 52 views
0

这是python3整个代码:值没有改变什么它应该(9号线)

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.不知道如何分类出现此问题的问题,但我不能为我的生活弄清楚这里缺少的东西。提前致谢。

+0

请检查并接受答案 –

回答

1

问题

问题是与分配临时的阵列

随着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 

因此温度[i]是0而不是1

如何解决

您可以使用copy,deepcopyslicing到阵列复制到临时

这里是工作的更新的代码,用于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

此行的值设置为0:

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

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

我认为你假定在第5行代码,这使得数组的副本:

temp = array 

但事实并非如此。这使temparray都引用相同的数组。如果你真的想要的数组的副本,这样做:

temp = array[:] 

此外,您可能需要修正线11为好,如果你是一个副本。

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

相关问题