【问题标题】:Variable contains None even after assignment即使在赋值后变量也包含 None
【发布时间】:2013-10-19 06:53:54
【问题描述】:

这是我写的一个函数:

def conc(i,s,y):
    if sheet.cell(i+1,0).value != sheet.cell(2,0).value :
        # print s
        rtrns = s
        # print rtrns
        return rtrns

    else:
        if i==list1[len(list1)-1]:
            while i<(sheet.nrows):
                # print i
                s = s + " " + unicode(sheet.cell(i,y).value).encode('cp1252', 'replace')
                i+=1
            # print s
            rtrns = s
            # print rtrns
            return rtrns
        else:
            s = s + " " + unicode(sheet.cell(i+1,y).value).encode('cp1252', 'replace')
            #return s
            conc(i+1,s,y)

在上述函数中,当我在第一个 if 块中打印 rtrns 的值时,它会显示我需要的值。

但是当我调用函数时

c = conc(x,c,2)     #where x fetches an integer value as an index from a list
print c

它返回None

【问题讨论】:

  • 你在 else 子句中的 return 语句在哪里?
  • 缩进有什么问题?而 else 块不需要 return 语句,它再次递归调用该函数,直到它满足具有 return 语句的两个块之一
  • 'def' 和 'if' 在同一缩进级别???
  • 您的函数不能保证返回。在某些情况下它不会返回任何东西。
  • @user2799617:这是我在此处复制粘贴代码时发生的错误。

标签: python python-2.7 return


【解决方案1】:

代码的 else 部分中缺少 return 语句

else:
    s = s + " " + unicode(sheet.cell(i+1,y).value).encode('cp1252', 'replace')
    #return s
    conc(i+1,s,y)

因此,有一个代码路径,您的递归函数conc 不会返回任何内容。

更改代码并添加返回

else:
    s = s + " " + unicode(sheet.cell(i+1,y).value).encode('cp1252', 'replace')
    #return s
    return conc(i+1,s,y)

递归调用总是返回给调用者。因此,当您递归调用 conc 并且其中一个代码路径发出返回语句时,调用将返回到从您调用的位置。另一个重要的事情是,一个没有显式返回的函数有一个隐式返回,没有任何返回

下面的 ASCII 艺术应该是对可能出错的地方的自我解释

foo() <------------------------------------------------------------------------
    |                                                                          |
    |                                                                          |
    |->def conc(...):                                                          |
           else:                                                             (None)
           .........                                                           |
              conc(i+1,s,y) <-------------------------------------------\      |
              return None  ----------------------------------------------U--- -|
               |                                                         |
               |                                                         | 
               \----->def conc(...):                                     |
                          else:                                        (None)
                          .........                                      |
                                conc(i+1,s,y) <----------------------\   |
                                return None   ------------------------U--|
                                |                                     |
                                |                                     |
                                |                                     |
                                \----------->def conc(...):        (rtrns)
                                                  if ... :            |
                                                  ..........          |
                                                      return rtrns----|

【讨论】:

  • 也许您还可以解释第一个return 语句返回其值的位置。 =)
  • @justhalf:ASCII 艺术解释得好吗?
  • @Abhijit:非常感谢。有效。此外,解释非常全面。干杯!
  • 但是为什么打印出来却不返回呢?
  • 返回给谁?它打印返回的值conc。无,是它返回并随后被打印的值
猜你喜欢
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 2015-08-16
相关资源
最近更新 更多