请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师你的代码应该是写错了。

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回答

代码确实是写错了,应该是这样的

https://img1.sycdn.imooc.com//szimg/5e6e178d09d4af5906350198.jpg

但是,关于函数的形参传递,要看参数的类型。我写了另一段代码,你可以对比一下区别:

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


0 回复 有任何疑惑可以回复我~
  • 提问者 py_builder #1
    谢谢老师,我已经完全搞懂了。
    回复 有任何疑惑可以回复我~ 2020-03-15 21:05:35
提问者 py_builder 2020-03-13 10:24:16

      结论:python无论程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。


但我更想知道C语言是怎样的一种方法,,但赶着学习后面的课程,就不下载C来测试了。

0 回复 有任何疑惑可以回复我~
  • NavCat #1
    你这个理解基本上到位了,关于C语言的测试结果,我给你的建议是这样的:
    1. 不同的语言有不同的实现机制,虽然我们学习的CPython也是C写的,如果同学感兴趣的话,可以更深一步的去研究学习。自己研究过、验证过,比直接看到的结果要更有效。
    2. 关于编程语言的研究,可谓是无穷无尽的,也不可能是一蹴而就的,需要长期积累。当然,在实际工作后,如果不是工作需要,一般也不会做特别的深入研究。如果是做学术研究,可能会研究得深入一点。
    老师鼓励你深入钻研下去,毕竟,这样的人在工作后就越来越少了。加油,同学,看好你!
    回复 有任何疑惑可以回复我~ 2020-03-15 20:01:51
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信