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],内容被改变了,看起来,像引用传递
总结
对于可变对象可以看做引用传递,不可变对象可以看做值传递。
阅读全文
0 0
- python 中 值传递 引用传递 可更改(mutable)与不可更改(immutable)对象
- 可更改(mutable)与不可更改(immutable)对象
- 关于Python参数传递时,传递可变对象(mutable)和不可变更对象(immutable)的误区
- python函数参数是值传递还是引用传递:取决于对象内容可变不可变
- python-对象之hashable&unhashable与immutable&mutable
- Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义
- Python参数传递 - 引用传递&值传递
- python参数传递问题与可变/不可变对象
- 值传递与引用传递
- 值传递与引用传递
- 值传递与引用传递
- 值传递与引用传递
- 值传递与引用传递
- 值传递与引用传递
- 引用传递与值传递
- 值传递与引用传递
- 引用传递与值传递
- 值传递与引用传递
- Centos7系统安装设置网络、防火墙配置、自动启动配置
- 页面获得路径
- MyBatis Generator 优化
- Linux系统编程——线程同步与互斥:互斥锁
- dubbo的安装
- python 中 值传递 引用传递 可更改(mutable)与不可更改(immutable)对象
- lxml解析器选择
- 10配置Greenplum数据库
- 关于二进制补码
- 从零开始的RxJava2.0教程(二)操作符
- python字典
- 读鸟哥Linux私房菜知识点总结(20170712)
- 奇异值分解(SVD)原理详解及推导
- 通讯录