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 将对象分配给名称的方式以及变量范围的工作方式。
为什么 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 将对象分配给名称的方式以及变量范围的工作方式。