python 中 值传递 引用传递 可更改(mutable)与不可更改(immutable)对象

来源:互联网 发布:json格式转换工具下载 编辑:程序博客网 时间:2024/06/07 14:17

部分内容参考自


可更改(mutable)与不可更改(immutable)对象

python中,strings, tuples, 和numbers是不可更改的对象,
list,dict等则是可以修改的对象。

例子

nfoo = 1nfoo = 2lstFoo = [1]lstFoo[0] = 2

代码第2行中,内存中原始的1对象因为不能改变,于是被“抛弃”,另nfoo指向一个新的int对象,其值为2

代码第4行中,更改list中第一个元素的值,因为list是可改变的,所以,第一个元素变更为2。其实应该说,lstFoo指向一个包含一个对象的list。赋值所发生的事情,

是有一个新int对象被指定给lstFoo所指向的数组对象的第一个元素,但是对于lstFoo本身来说,所指向的数组对象并没有变化,只是数组对象的内容发生变化了。

这个看似void*的变量所指向的对象仍旧是刚刚的那个有一个int对象的list。


如图

函数中值传递还是引用传递

其实,python函数参数传递可以理解为就是变量传值操作

不可变对象参数调用

def ChangeInt( a ):    a = 10nfoo = 2 ChangeInt(nfoo)print nfoo #结果是2
有一个int对象2,和指向它的变量nfoo,当传递给ChangeInt的时候,按照传值的方式,复制了变量nfoo的值,这样,a就是nfoo指向同一个Int对象了,函数中a=10的时候,

发生什么?(还记得我上面讲到的那些概念么),int是不能更改的对象,于是,做了一个新的int对象,另a指向它(但是此时,被变量nfoo指向的对象,没有发生变化),

于是在外面的感觉就是函数没有改变nfoo的值


可变对象参数调用

def ChangeList( a ):    a[0] = 10lstFoo = [2]ChangeList(lstFoo )print nfoo #结果是[10]

当传递给ChangeList的时候,变量仍旧按照“传值”的方式,复制了变量lstFoo 的值,于是a和lstFoo 指向同一个对象,但是,list是可以改变的对象,对a[0]的操作,就是对lstFoo指向的对象的内容的操作,于是,这时的a[0] = 10,就是更改了lstFoo 指向的对象的第一个元素,所以,再次输出lstFoo 时,显示[10],内容被改变了,看起来,像引用传递

总结

对于可变对象可以看做引用传递,不可变对象可以看传递。

原创粉丝点击