我们需要在函数中使用 root = None 吗? (python BST,引用计数)
Do we need to use root = None during in the function? (python BST, reference counting)
我正在练习删除 BST 中的节点并遇到以下代码。
def deleteNode(root, key):
if root is None:
return root
if key < root.key:
root.left = deleteNode(root.left, key)
elif(key > root.key):
root.right = deleteNode(root.right, key)
else:
if root.left is None:
temp = root.right
root = None
return temp
elif root.right is None:
temp = root.left
root = None
return temp
temp = minValueNode(root.right)
root.key = temp.key
root.right = deleteNode(root.right, temp.key)
return root
我的问题是我们需要root = None这一行吗?根据引用计数,我觉得 root 会被自动销毁,因为像 parent.child 这样的唯一引用被分离了。非常感谢任何解释。
鉴于 root = None
紧跟在 return temp
之后,它只是(重新)绑定了一个局部变量,该变量立即再次被丢弃并且没有任何效果。
在给定的代码中,可以删除行 root = None
而不会更改 运行 代码的结果。
大概是代码从另一种语言翻译得太直了,在这种语言中,分配给变量会改变内存位置的内容。
但在 Python 中,赋值运算符 =
只是将一个新名称 1 绑定到一个已经存在的对象(在这种情况下它给出了名称root
到对象 None
) 并且不会更改对象或内存中的任何其他对象。
1 至少在左侧有“简单名称”,分配给 a[i]
.[=17 这样的东西时会稍微复杂一些=]
不,这些行不是必需的。但是,如果您删除了任一分支中的早期 return,则需要设置 root = None
.
我正在练习删除 BST 中的节点并遇到以下代码。
def deleteNode(root, key):
if root is None:
return root
if key < root.key:
root.left = deleteNode(root.left, key)
elif(key > root.key):
root.right = deleteNode(root.right, key)
else:
if root.left is None:
temp = root.right
root = None
return temp
elif root.right is None:
temp = root.left
root = None
return temp
temp = minValueNode(root.right)
root.key = temp.key
root.right = deleteNode(root.right, temp.key)
return root
我的问题是我们需要root = None这一行吗?根据引用计数,我觉得 root 会被自动销毁,因为像 parent.child 这样的唯一引用被分离了。非常感谢任何解释。
鉴于 root = None
紧跟在 return temp
之后,它只是(重新)绑定了一个局部变量,该变量立即再次被丢弃并且没有任何效果。
在给定的代码中,可以删除行 root = None
而不会更改 运行 代码的结果。
大概是代码从另一种语言翻译得太直了,在这种语言中,分配给变量会改变内存位置的内容。
但在 Python 中,赋值运算符 =
只是将一个新名称 1 绑定到一个已经存在的对象(在这种情况下它给出了名称root
到对象 None
) 并且不会更改对象或内存中的任何其他对象。
1 至少在左侧有“简单名称”,分配给 a[i]
.[=17 这样的东西时会稍微复杂一些=]
不,这些行不是必需的。但是,如果您删除了任一分支中的早期 return,则需要设置 root = None
.