python的函数是传值还是传引用?

ssdx 2010-01-08 03:09:49
新手,对Python的函数默认是传值还是传引用不太了解。
...全文
1043 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ssdx 2010-01-12
  • 打赏
  • 举报
回复
分析的不错,不过通过分析,我的结论是全部传值。
>>> a=3
>>> def f(b):
... b=1
...
>>> f(a)
>>> a
3
传值 如果传引用外面的a应该bind到1上,而不是出了函数就自动用绑回3

>>> a=[1,2]
>>> def f(b):
... b[0]='a'
>>> a
[1, 2]
>>> f(a)
>>> a
['a', 2]
传值,只不过外面的a和里面的b都是对[1,2]这个list的应用,相当于c中传指针。改变了指针指向的内容。但是函数的指针只是参数指针的拷贝。



thy38 2010-01-09
  • 打赏
  • 举报
回复
我一个朋友说不明白,我再说一下
a=3; a=4在Python中和C++中是不一样的
Python中是由系统生成了一个新的对象4(地址当然改变了),然后让a重新指向4。
C++中a是一个内存地址的记号,a=4是将a所指的内存处的值更改为4,a的地址不变。
thy38 2010-01-09
  • 打赏
  • 举报
回复
这样也能够解释复合类型的行为:
>>> a=[1,2]
>>> def f(b):
... b[0]='a'
>>> a
[1, 2]
>>> f(a)
>>> a
['a', 2]
f(b)中的b和外面的a本来就是同一个对象嘛,对b[0]赋值等同于对a[0]赋值。
thy38 2010-01-09
  • 打赏
  • 举报
回复
以我的理解,Python中函数全部是传引用的。那么很快会有人问,怎么解释这段代码:

>>> a=3
>>> def f(b):
... b=1
...
>>> f(a)
>>> a
3

以前就是这个让我认为Python中的基本类型是传值的,复合类型才是传引用的。实际上Python中的基本类型也是以引用方式来管理的,比如:
>>> a=3
>>> id(a)
27022056
>>> b=3
>>> id(b)
27022056
id完全相同。因此像a=3然后a=4,并非是a的值变了,而是a的引用变了,原来引用对象3,现在引用对象4。

理解了以上的,我就得出结论:Python中函数传递的一定是引用。我们再回来开头的代码,我加了点东西:
>>> a=1
>>> id(a)
27022080
>>> def f(b):
... print id(b)
... print a is b
... b='a'
... print id(b)
>>> f(a)
27022080
True
27176480
前两行清楚地说明a和b是引用的同一个对象1,id是相同的。所以是传的引用。为什么f(a)之后值没有变?因为b='a'是生成为一个新的对象,然后让b重新指向这个新的对象,而不再指向原来的对象1(就是我上面说的不是改变值,而是改变了引用)。

一家之言,欢迎不同意见!

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧