【问题标题】:Why python does not return reference? [duplicate]为什么python不返回引用? [复制]
【发布时间】:2020-06-20 22:14:28
【问题描述】:

我有一个关于 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

我想我修改了 l.1 行上的 ans 列表对象并将其返回,然后在 l.2 行上,我通过了 l.3 行上的 ans 引用。 但是当我同时打印值ansret 时,ret 不包含与ans 相同的值。

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

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

【问题讨论】:

    标签: python call-by-value


    【解决方案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
      

      这将是输出:

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

    【讨论】:

      【解决方案2】:

      这是因为可变范围。函数brackets 内部的变量与函数外部的变量不同,即使它们具有相同的名称(ans)。 Here is an article 这可能会帮助你。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-21
        • 2019-01-02
        • 2018-04-14
        • 1970-01-01
        • 2021-11-19
        相关资源
        最近更新 更多