我有一个简单的代码
class Node:
def __init__(self,val = 0):
self.val = val
self.right = None
def func(obj,n):
if not n:
obj = None
return
obj.right = Node()
func(obj.right,0)
root = Node()
func(root,1)
#print(root.right.val)
#this gives me 0. How?? it should give me error
当我运行此代码时,我注意到 obj=None 没有执行任何操作,并且我的初始对象(上述程序中的根)仍然具有 root.right 组件,其值为 0。任何人都可以解释一下发生了什么以及如何修复问题? 我想要的期望行为是,root.val 应该为 0,root.right 应该为 None。谢谢你。
在 Python 中,函数参数是通过赋值传递。您的代码看起来有点类似于以下内容:
root = Node()
obj = root
obj = None
如您所见,外部作用域中的变量
root
没有被重新分配给新值。并且因为它仍然引用旧值,所以它不会被垃圾收集清理。
这里一个简单的解决方案是
return
应取代 root 的新值。这样,您就可以允许使用函数的结果来重新分配从外部作用域传入的变量。例如
def func(obj,n):
if not n:
return None
obj.right = func(Node(), 0)
return obj
root = Node()
root = func(root,1)