Skip to main content
 首页 » 编程设计

python之函数返回的奇怪行为

2025年05月04日12insus

我花了很多时间搜索所有“我的函数不返回”和“嵌套字典搜索”消息,但没有一条消息特别适用,也没有解决我的问题。

我创建了一个函数来搜索嵌套字典并返回路径。这很好用!我可以从函数内部打印结果,但紧接在打印下方的 return 返回 None。也许我看它太久了,它可能就在我面前,但我只是看不出这里有什么问题。这是我的完整代码:

def search(v, searchterm, vid, path=(),): 
    if isinstance(v, dict): 
        for k, v2 in v.items(): 
            p2 = path + ('{}'.format(k),) 
            search(v2, searchterm, vid, p2) 
    else: 
      if searchterm in v: 
         a = {} 
         a[0] = path 
         a[1] = v[vid] 
         print(a) 
         return(a) 
 
 
def main(): 
 
    mydata = {} 
    mydata[1] = {} 
    mydata[1][1] = 'data-1-1','reason-1-1','notes-1-1' 
    mydata[1][2] = 'data-1-2','reason-1-2','notes-1-2' 
    mydata[1][3] = 'data-1-3','reason-1-3','notes-1-3' 
    mydata[1][4] = 'data-1-4','reason-1-4','notes-1-4' 
    mydata[1][5] = 'data-1-5','reason-1-5','notes-1-5' 
    mydata[1][6] = 'data-1-6','reason-1-6','notes-1-6' 
    mydata[1][7] = 'data-1-7','reason-1-7','notes-1-7' 
    mydata[1][8] = 'data-1-8','reason-1-8','notes-1-8' 
    mydata[1][9] = 'data-1-9','reason-1-9','notes-1-9' 
    mydata[1][10] = 'data-1-10','reason-1-10','notes-1-10' 
    mydata[2] = {} 
    mydata[2][1] = 'data-2-1','reason-2-1','notes-2-1' 
    mydata[2][2] = 'data-2-2','reason-2-2','notes-2-2' 
    mydata[2][3] = 'data-2-3','reason-2-3','notes-2-3' 
    mydata[2][4] = 'data-2-4','reason-2-4','notes-2-4' 
    mydata[2][5] = 'data-2-5','reason-2-5','notes-2-5' 
    mydata[2][6] = 'data-2-6','reason-2-6','notes-2-6' 
    mydata[2][7] = 'data-2-7','reason-2-7','notes-2-7' 
    mydata[2][8] = 'data-2-8','reason-2-8','notes-2-8' 
    mydata[2][9] = 'data-2-9','reason-2-9','notes-2-9' 
    mydata[2][10] = 'data-2-10','reason-2-10','notes-2-10' 
 
    b = search(mydata,'reason-2-4', 2) 
    print(b) 
 
if __name__ == '__main__': 
   main() 

结果:

{0: ('2', '4'), 1: 'notes-2-4'} 
None 

您可以看到函数内部的打印效果很好,但 main 的返回和打印返回 None。我已经使用 Python 编程几年了,编写了许多函数、类和方法并返回值,但这个让我卡住了。

请您参考如下方法:

您正在进行递归 调用,并且在嵌套调用中发出了print 语句。然而,search 的返回值没有被使用,这就是为什么它永远不会到达 main 函数的原因。

下面,我添加了一个被检查的 nested 变量,如果发现任何实际返回的内容。

def search(v, searchterm, vid, path=(),): 
  if isinstance(v, dict): 
    for k, v2 in v.items(): 
      p2 = path + ('{}'.format(k),) 
      nested = search(v2, searchterm, vid, p2) 
      if nested: 
        # before, nothing was ever returned here 
        return nested   
    else: 
      if searchterm in v: 
         a = {} 
         a[0] = path 
         a[1] = v[vid] 
         print(a) 
         return(a) 

不相关,但在这里您可以充分利用 python 强大的字典字面值

  mydata = { 
    1: { 
      1: ('data-1-1', 'reason-1-1', 'notes-1-1'), 
      2: ('data-1-2', 'reason-1-2', 'notes-1-2') 
    2: { 
      1: ('data-2-1', 'reason-2-1', 'notes-2-1'), 
      2: ('data-2-2', 'reason-2-2', 'notes-2-2') 
    } 

此外,如果您所有的字典键都是 int,您也可以使用 list。