chenxin6676 发表于 2014-12-16 18:41

关于值传递,引用传递,不可变对象,可变对象的疑问


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

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


def ChangeList(a):
    a=
b=
ChangeList(b)
print b # ->

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

路人贾 发表于 2014-12-16 21:55

本帖最后由 路人贾 于 2014-12-16 22:10 编辑

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

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

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

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

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

路人贾 发表于 2014-12-17 11:10

你可以看看learning python这本书,有中文版的,会对理解这些有很大帮助,我也是刚接触python,理解不是很透彻,回复 3# chenxin6676


   
页: [1]
查看完整版本: 关于值传递,引用传递,不可变对象,可变对象的疑问