2014-04-25 41 views
-1
def prod (lsts): 
    product = 1 
    for i in lsts: 
     sum = 0 
     for x in i: 
      sum += x 
     product *= sum # I will change this line and a problem will appear 
    return product 

b = [[2], [2,3,4], [5,2], []] 
c = [[]] 
print prod (b) 
print prod (c) 

**我的第一个问题是: 为什么当我改变行的缩进,像这样的评论:为什么变化会导致模糊的结果?

for x in i: 
    sum += x 
    product *= sum # I make the line have the same indentation with the above line. 

打印的结果不为0,但6300和1?

我可以找出列表b的结果,但我不能与列表c,列表只有一个空列表。 这是我认为该程序将与列表c运行的过程:

  1. 第一次for循环开始。
  2. 秒开始循环。在第二个for循环中,对于循环结束,sum = 0.秒。
  3. product = 0.
  4. 首先用于循环结束。退货产品。
  5. 打印

为什么打印的结果不为0,但1?

**我的第二个问题是,为什么即使我只改变我原来的脚本是这样的:

c = [] # in my original script, I have c = [[]] 

打印也为1,不为0的结果呢?

+0

在回答你的第一个问题 - 改变的倍线被执行数.. – mgilson

+0

'为什么当我用这样的注释改变行的缩进:' - 那么'product'赋值是循环的一部分。 – devnull

+2

请记住,缩进是非常非常重要的蟒蛇。将'product * = sum''移动到和''sum + = x''相同的缩进位置在for循环中移动它 – aruisdante

回答

1

当您遍历空列表时,循环会运行零次 - 换句话说,它会立即跳到最后。所以,在你的原代码,用lsts=[[]]

def prod (lsts): 
    product = 1 
    for i in lsts: 
     sum = 0 
     for x in i: 
      sum += x 
     product *= sum # I will change this line and a problem will appear 
    return product 

运行这样:

  1. 产品= 1
  2. for循环开始(I = [])
  3. 总和= 0
  4. 我是空的,所以对于循环跳过
  5. product(1)* = sum(0),so product = 0
  6. 个没有更多i S IN LSTS,所以对于循环结束
  7. 返回产品

当缩进线product *= sum

def prod (lsts): 
    product = 1 
    for i in lsts: 
     sum = 0 
     for x in i: 
      sum += x 
      product *= sum 
    return product 

变得的一部分内的for循环(运行零次),所以它运行这种方式:

  1. 产物= 1
  2. 为循环开始(I = [])
  3. 总和= 0
  4. i的空的,所以for循环在LSTS跳过
  5. 没有更多i S,SO for循环结束
  6. 返回产品

请注意,在这种情况下,产品永远不会被后您最初将其设置为1。

当你有lsts=[]重新分配,整个for循环外被跳过,所以它运行这样的:

  1. 产品= 1个
  2. LSTS是空的,所以循环跳过
  3. 收益产品
+0

谢谢lvc。你节省了我的一天。 – Phammanhhiep

相关问题