免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7879 | 回复: 2
打印 上一主题 下一主题

到底是值传递,还是引用传递? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-01 06:44 |只看该作者 |倒序浏览
x=1
L=[]
L.append(x)

def f(x,L=[2]):
        x=2*x
        L.append(x)
        print L,x
       
f(x)
print "f(x):",L,x

f(x,L)
print "f(x,L):",L,x

得到的结果是:
[2, 2] 2
f(x): [1] 1
[1, 2] 2
f(x,L): [1, 2] 1

结果第二行用值传递完全解释得通。
结果第四行用引用传递完全解释得通。

那么问题是:python里到底使用之传递还是引用传递?

又或者是两者都使用,那么在什么情况下使用值传递,在什么情况下使用引用传递?
有没有相关资料?

论坛徽章:
0
2 [报告]
发表于 2007-02-01 08:23 |只看该作者
其实到了python中差别不大.最主要的是python是通过赋值来创建一个对象的.所以对于python中的对象,

a='1'

这样不能叫修改,只能叫创建.如果你认为这样就是修改的话,就错了.一旦使用了赋值语句,就基本上与原对象无关了.而且python还有可变对象和不可变对象.象简单类型,整数,字符串,tuple都是不可变的.而象list, dict, object都是可变的.所以对于它们的修改一般是调用相应的方法,如对于list,你要a.append(b),对于dict你要a['b'] = '1'等.对象本身是没有什么变化,它的属性或值发生成变化.对于这种种情况,传值还是引用都是一样的.

不过,可能说引用更准确一些,比如:

a = []
def b(c):
    print id(c)

print id(a)
b(a)

你会看到两次打印出来的id值是一样的.说明是引用传递.也就是说函数b中的参数所指的对象就是a.理解为传值也无所谓,因为从赋值的角度来说,在函数中的赋值会创建新的对象,不会影响到原参数.

其实在python中变量名与真正的对象是一种绑定关系,或引用的关系.所以理解为引用更为合适.

论坛徽章:
0
3 [报告]
发表于 2007-02-01 17:13 |只看该作者
明白了,谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP