递归下实例变量和实例对象的行为

Behaviour of instance variables and instance objects under recursion

提问人:justanothertechdude 提问时间:5/20/2020 更新时间:5/20/2020 访问量:40

问:

我试图澄清我对这两个代码片段之间差异的理解,这两个代码片段找到了二叉树的最大深度。(为简单起见,我没有包括班级)

因此,第一个代码变量始终为 1 的原因是因为它不是一个对象,而只是一个变量,所以当我将它传递到函数中时,就会创建一个它的新“版本”。

而在第二个代码示例中,该函数使用对同一数组对象的引用。

这是否意味着 python 3 是按变量的值和对象的引用传递的?

  def maxDepth(self, root: TreeNode) -> int:

        if not root:
            return 0

        max_depth = 1 

        self.check_depth(root.left, max_depth, 1)
        return max_depth

    def check_depth(self, node, max_depth, curr_depth):

        if not node:
            return 

        curr_depth += 1
        self.check_depth(node.left, max_depth, curr_depth)
        self.check_depth(node.right, max_depth, curr_depth)

        max_depth = max(max_depth, curr_depth)
        return

在这里,实例变量被替换为数组对象。

def maxDepth(self, root: TreeNode) -> int:

    if not root:
        return 0

    max_depth = [1] 

    self.check_depth(root.left, max_depth, 1)
    return max_depth[0]

def check_depth(self, node, max_depth, curr_depth):

    if not node:
        return 

    curr_depth += 1
    self.check_depth(node.left, max_depth, curr_depth)
    self.check_depth(node.right, max_depth, curr_depth)

    max_depth[0] = max(max_depth[0], curr_depth)
    return

谢谢

python-3.x 函数 pass-by-reference pass-by-value

评论

2赞 juanpa.arrivillaga 5/20/2020
1是一个对象。在 Python 中,一切都是一个对象。将对象传递给函数永远不会复制该对象。在一种情况下,您更改了对象(您的列表),在另一种情况下,您没有。就是这么简单。
1赞 Mark Ransom 5/20/2020
Python 始终是按引用传递的,但如果它是对不可变对象(如 )的引用,则无法区分。int
1赞 juanpa.arrivillaga 5/20/2020
@justanothertechdude “这是否意味着 python 3 是按变量的值传递的,通过引用传递对象”不,再说一遍,一切都是对象。Python 不使用这两种评估策略。它使用按对象共享调用,有时称为“按赋值调用”,因为您可以将其视为与函数中的局部变量赋值完全相同的工作方式。有关详细信息,请参阅此问题的公认答案
1赞 juanpa.arrivillaga 5/20/2020
@MarkRansom当然,但我的观点是,作为评估策略的引用调用是有明确定义的。人们松散地使用这个词来表示“传递引用”,但这并不是它的实际含义。而且无论如何,在 C 实现中,使用了按值调用,C 只支持按值调用,当然,它使用指针。但这并不能使 Python 按值调用。让我给你一个思想实验,假设我在 Fortran 中实现 Python,完全使用引用调用。这不会使 Python 通过引用调用。Python 评估策略的语义与这两者不同。
2赞 justanothertechdude 5/20/2020
@juanpa.arrivillaga 非常感谢!我学到了很多关于 Python 的知识,并且能够理解我做错了什么,以及为什么它以这种方式工作。

答: 暂无答案