Python函数变量赋值与自定义class

Python function variable assignment with self-defined class

为什么 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

列表的内存位置没有改变(但是第一个元素的内存位置改变了)。当你改变变量名的值时,python将变量名赋给另一个内存位置:

>>> node = None

>>> id(node)

4394834344

>>> node = Node(10)

>>> id(node)

4397990184

正如您在上面看到的,节点现在指向内存中的不同位置。

所以在您的代码中,您调用函数 replaceNode2 的地方,您将 local-variable node 分配给一个新的 Node 对象,它指向一个新的内存位置,而 parent-scope 中的 node 仍然指向原始内存位置 并且是仍然是 NoneType 对象。这就是你得到那个错误的原因。不是因为 NoneType 对象的可变性,而是因为 python 将对象分配给名称的方式以及变量范围的工作方式。