在实现二叉树的代码时,使用递归调用,当给空叶子节点赋值的时候,发现只修改了局部变量。 因此研究了一下Python中传值和传引用的问题。
a = None
print(id(a))
b = None
print(id(b))
4321685368 4321685368
结论: 结果指向同一块区域
def test(x):
x = x+2;
a = 2
print(a)
2
结论: 没有改变原变量
def test(x):
x = [1,2,3]
a = [1,2]
print(a)
print(id(a))
test(a)
print(a)
print(id(a))
[1, 2] 4370314760 [1, 2] 4370314760
结论: 没有改变原变量地址
def arrayadd(x):
x.append(1)
a = [1,2]
print(a)
print(id(a))
arrayadd(a)
print(a)
print(id(a))
[1, 2] 4370399624 [1, 2, 1] 4370399624
结论:变量地址不变,值改变。
如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。 如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。
实验一、二说明不可变对象的使用方法。
实验四,说明了可变对象的使用方法。
实验三,使用赋值操作要注意没有改变原对象,相当于传值。
def _insert_(self,node,key,value):
print(id(node))
print(id(self.root))
if(node==None):
node = Node(key,value)
self.count = self.count+1
print(id(node))
print(id(self.root))
elif(node.value>key):
self._insert(node.lnode,key,value)
elif(node.value<key):
self._insert(node.rnode,key,value)
else:
node.value = valu
如果 node =None,相当于node指向一个不可变对象,在调用insert函数时,仅传值。
def _insert(self,node,key,value):
if(node.key == key):
node.value = value
elif(node.key > key):
if(node.lnode == None):
node.lnode = Node(key,value)
self.count = self.count+1
return
else:
self._insert(node.lnode,key,value)
elif(node.key < key):
if(node.rnode == None):
node.rnode = Node(key,value)
self.count = self.count + 1
return
else:
self._insert(node.rnode,key,value)
总结:作者本着折腾自己的想法,将用java和c写的数据结构,都用Python实现一遍,帮助记忆。这个过程中,还是发现对python语法很多不了解的地方。