免费注册 查看新帖 |

Chinaunix

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

关于值传递,引用传递,不可变对象,可变对象的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-16 18:41 |只看该作者 |倒序浏览

def ChangeInt(a):
    a=10
b=2
ChangeInt(b)
print b # ->2

def ChangeList(a):
    a[0]=10
b=[2]
ChangeList(b)
print b # ->[10]


def ChangeList(a):
    a=[10]
b=[2]
ChangeList(b)
print b # ->[2]

以上抛开基本概念,仅仅从内存角度来理解,如何理解呢? 费解了两天了,感觉还是迷糊...
不胜感激...

论坛徽章:
1
天蝎座
日期:2014-11-24 15:57:32
2 [报告]
发表于 2014-12-16 21:55 |只看该作者
本帖最后由 路人贾 于 2014-12-16 22:10 编辑

函数的参数是通过赋值进行对象的传递的,函数能够改变传入的可变对象。整数和字符串属于不可变对象,列表和字典属于可变对象

前两个应该是容易理解的,第三个的话,在函数中对a进行赋值,并不是对可改变对象进行改变,而是创建了新的列表对象,并将新的列表对象赋值给了a,但是由于作用域的关系,这里的a是一个新的变量,不同于函数外面的a,所以函数返回后,a并没有改变。
以上是个人理解,供楼主参考,如有错误,欢迎指正

论坛徽章:
0
3 [报告]
发表于 2014-12-17 10:47 |只看该作者
回复 2# 路人贾


    我暂时的理解如下,还找不到确凿的资料说明,只是自己试验的结果,不知道是否正确:

def ChangeInt(a):
    a=10
b=2
ChangeInt(b)
print b   # ->2
翻译为非函数的样子:
b=2
a=b     #a的内存地址跟b是一样的,说明这里是内存地址拷贝,因此赋值可以理解为指针指向
a=10   #将a指向了新创建的10对象,a的内存地址发生了改变.
print b

def ChangeList(a):
    a[0]=10
b=[2]
ChangeList(b)
print b   # ->[10]
翻译为非函数:
b=[2]
a=b         #a的内存地址跟b是一样的,说明这里是内存地址拷贝,因此赋值可以理解为指针指向
a[0]=10   #将a指向的列表的第一个元素值指向内存新创建的10对象,a的内存地址没有改变,仍然跟b的内存地址一致.
print b

def ChangeList(a):
    a=[10]
b=[2]
ChangeList(b)
print b   # ->[2]
翻译为非函数:
b=[2]
a=b         #a的内存地址跟b是一样的,说明这里是内存地址拷贝,因此赋值可以理解为指针指向
a=[10]     #重新创建了一个新的列表,a指向这个新列表,a的内存地址发生了改变.
print b

总结以上3个例子,可以理解为:
1.python中的赋值"="语句,可以理解为指针的指向.
2.由于指针指向问题,故才衍生出"作用域"的概念,而不是因为有作用域的"人为限制"造成的以上结果,是吧?!
3.注意区分可变对象与不可变对象的区别.list,dict,int,char,tuple...
4.以此也推出了值传递与引用传递的概念,可以统一理解为python中都是引用传递.

论坛徽章:
1
天蝎座
日期:2014-11-24 15:57:32
4 [报告]
发表于 2014-12-17 11:10 |只看该作者
你可以看看learning python这本书,有中文版的,会对理解这些有很大帮助,我也是刚接触python,理解不是很透彻,回复 3# chenxin6676


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP