我正在尝试编写一个计算BST中不同元素数量的方法。这是我的代码:
def numDistinct(root):
distinct = 0
seen = {}
def private_helper(root):
if not root: return
if root.val not in seen:
seen[root.val] = root.val
distinct += 1
private_helper(root.left)
private_helper(root.right)
private_helper(root)
return distinct
然而,它给了我错误UnboundLocalError: local variable 'distinct' referenced before assignment
。我理解错误,但我觉得奇怪的是seen
与distinct
具有相同的范围,并没有抛出相同的错误(即使它在private_helper()
之前被引用{ {1}}是)。为了测试这一点,我将distinct
更改为dict并进行设置,以便我仍然可以将其用作计数器:distinct
。错误停止,我的方法开始完美运行。这里发生了什么?不同数据类型之间的范围是否存在差异?
答案 0 :(得分:0)
差异是因为可变性。字典是一个可变对象。查看在函数范围内调用distinct时,它首先尝试访问distinct所持有的对象,并尝试将distinct重新绑定到另一个对象。
distinct += 1
or
distinct = distinct + 1
是一样的。但是在字典的情况下,你会反弹字典所拥有的名字。你改变了一个已存在的对象。