1
raquelken 2013-05-08 16:25:45 +08:00 1
既不是引用也不是拷贝,参数名字就真的只是名字而已,关键是你例子里面的pp.data和main的dd是同一个对象,而且Data是可修改的(mutable)
所以你可以修改pp.data的para属性,也就是dd的para属性 http://effbot.org/zone/python-objects.htm |
2
Idiosyncratic 2013-05-09 15:46:53 +08:00
@raquelken 我感觉,lz想问的是参数传递的方式而不是object的底层实现啊。。,
其实按照那片文章的意思,所有的名字其实都是一种 对于对象的指针(比喻而已,暂时想不到更贴切的),那么所有的参数传递应该都可以视为引用传递 |
3
thedevil5032 2013-05-09 16:24:11 +08:00
函数参数是引用还是拷贝的知识在哪里能有介绍?
其实这个问题的关键在于,你的参数是什么类型的。(貌似是这样的) http://docs.python.org/2/library/copy.html #### a = 1 b = 1 id(a) == id(b) # 自己的一点理解 # 通常赋值一个常量对象,实际上是把一个常量名和内存中的一个值联系起来了。 # 但是如果是集合型的对象(list,dict等,具体参照上面的链接),则有时会是复制,有时则是“链接”。 |
4
raquelken 2013-05-09 16:48:02 +08:00
@Idiosyncratic 如果是引用的话,如何用python实现这个呢?
void addone(int &in) { in ++; } int main(int argc, char const *argv[]) { int in = 1; addone(in); return 0; } |
5
yuelang85 2013-05-09 17:23:59 +08:00
可以使用id函数来测试。
python中,没有传递值,任何时候都是传递指针。 >>> def a(x, y): ..._____print id(x), id(y) ..._____x.append(1) ..._____y+=1 ..._____print id(x), id(y) ... >>> x = [] >>> y = 0 >>> id(x), id(y) (4547969608, 140234989831872) >>> a(x, y) 4547969608 140234989831872 4547969608 140234989831848 >>> int,str是不可变对象,自身不能改变,所以修改的时候会产生新对象。而list,dict等可以修改自身 |
6
Idiosyncratic 2013-05-09 17:42:01 +08:00
@raquelken 嗯,那也是,所以说,我觉得那片文章讲的只是python底层object和name的如何绑定的关系,并没有解释参数传递的方式;具体在参数传递上应该还是和其他面向对象语言很像,要看对象的类型,值类型就值传递(int,或是C#里的struct),引用类型就引用传递;
以上只是猜测哈,我没仔细研究过python,不过感觉用着像是这么回事 |
7
timonwong 2013-05-09 19:48:07 +08:00
@Idiosyncratic
传递方式与java类似,属于“值传递"(只是python没有primitive types,所有的值传递传递的都是**对象的引用**) |
8
yuelang85 2013-05-09 19:51:34 +08:00
|
9
Idiosyncratic 2013-05-09 20:55:57 +08:00
|
10
yuelang85 2013-05-09 21:04:47 +08:00
@Idiosyncratic 客气。
|