为什么 replaceNode1 有效而 replaceNode2 无效?我考虑过可变性,但 None 是可变的。感谢您的时间
class Node:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def replaceNode1():
node = [None]
def doit(val, node):
node[0] = Node(val)
doit(20, node)
return node[0].val # return 20
def replaceNode2():
node = None
def doit(val, node):
node = Node(val)
doit(20, node)
return node.val # return 'NoneType' has no attribute 'val'
python 中的赋值运算符没有做你认为它在做的事情。我希望这有助于阐明:
假设您使用 None 创建一个列表对象,因为它是唯一的元素,并使用以下命令获取其内存位置id
:
>>> node = [None]
>>> id(node)
4397969352
现在你改变它的第一个值:
>>> node[0] = 100
>>> print(node[0])
100
>>> id(node)
4397969352
列表的内存位置没有改变(但是它的第一个元素的内存位置已经改变了)。当您更改变量 name的值时,python 会将变量的名称分配给另一个内存位置:
>>> node = None
>>> id(node)
4394834344
>>> node = Node(10)
>>> id(node)
4397990184
如上所示,节点现在指向内存中的不同位置。
因此,在你的代码,在那里你调用函数replaceNode2,你指定本地变量 节点到一个新的Node对象,它指向一个新的存储位置,而节点在父范围仍指向原始存储位置是仍然是一个 NoneType 对象。这就是你得到那个错误的原因。不是因为 NoneType 对象的可变性,而是因为 python 将对象分配给名称的方式和变量范围的工作方式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句