老师你的代码应该是写错了。
来源:2-14 可变对象和不可变对象

py_builder
2020-03-13
def add(num):
print('-------------')
print(num, id(num))
num += 2
print(num, id(id))
return num
n = 100
print(n, id(n)) ### 这一行应该写的是 print(n, id(num))
rest = add(n)
print(rest, id(rest))
print(n, id(n))
运行结果:
100 1649703040
————————————
100 1649703040
102 2174601690064 #这里地址跟另外3个不一样 其实就是因为写错了,写成了 id(id)
102 1649703104
100 1649703040
当我改过来以后,运行结果是这样的:
100 1649703040
——————————————
100 1649703040
102 1649703104
102 1649703104
100 1649703040
因此可以这么总结, python中,函数是传引用,即被调函数内的形参num直接指向了 n,,然后假设需要改变n的值,,实际上是没办法改变的,,只能新建一个对象,,最后返回的时候依然传引用,,因此把 新建对象的地址传回给n,,导致 n这个引用也改变了。
老师,不知道我这样分析对不对呢?
2回答
-
代码确实是写错了,应该是这样的
但是,关于函数的形参传递,要看参数的类型。我写了另一段代码,你可以对比一下区别:
def add_2(l): print('---------------') print(l, id(l)) l.append(2) print(l, id(l)) return l l = [] print(l, id(l)) res = add_2(l) print(res, id(res)) print(l, id(l))
执行结果:
[] 59432904 --------------- [] 59432904 [2] 59432904 [2] 59432904 [2] 59432904
012020-03-15 -
py_builder
提问者
2020-03-13
结论:python无论程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。
但我更想知道C语言是怎样的一种方法,,但赶着学习后面的课程,就不下载C来测试了。
012020-03-15
相似问题