0

我有一个关于 Python 如何返回值的问题。下面是我练习递归函数的简单python代码。

def brackets(ans, n, cur, open, close):
    if len(cur) == n*2:
        ans.append(cur)   # <---l.1
        return ans        # <---l.2   

    if open < n:
        brackets(ans, n,cur+"(",open+1,close)

    if open > close:
        brackets(ans, n,cur+")",open,close+1)

ans = []
ret = brackets(ans, 2, "", 0,0)  # <---l.3
print(ans)
print(ret)

===== 
return:
['(())', '()()']
None

我想我ans在 l.1 行修改列表对象并返回它,在 l.2 行,我在 l.3 行传递ans引用。但是当我同时打印 valueansret时,ret不包含与 相同的值ans

当然,我只是打印ans出正确答案,但我希望 Python 初始化变量并在第 l.3 行ret分配brackets返回引用。ret

我对python如何通过函数传递引用感到困惑。请让我知道相关文件或答案。

4

2 回答 2

1

如果 的长度cur不是n*2,则brackets()函数不返回任何值。老实说,要知道它应该返回什么并不容易,因为您没有发布一些预期的结果。也就是说,这里有一些选项:

  1. 总是返回递归调用的值:

     if open < n:
         return brackets(ans, n,cur+"(",open+1,close)
    
     if open > close:
         return brackets(ans, n,cur+")",open,close+1)
    

    在这种情况下,这将是最终结果:

     ['(())']
     ['(())']
    

    或者

  2. ans在函数结束时返回:

     return ans
    

    这将是输出:

     ['(())', '()()']
     ['(())', '()()']
    
于 2020-03-09T00:58:38.820 回答
0

这是因为变量范围。函数内部的变量与函数brackets外部的变量不同,即使它们具有相同的名称 ( ans)。这是一篇可能对您有所帮助的文章。

于 2020-03-09T00:57:52.433 回答