关于Python参数传递时,传递可变对象(mutable)和不可变更对象(immutable)的误区
来源:互联网 发布:真正卖原单的淘宝店铺 编辑:程序博客网 时间:2024/05/17 21:53
从简,不说废话:
# 数字、字符串、tuple都是不可变对象 # list、dict是可变对象 #Python函数参数对于可变对象,函数内对参数的改变会影响到原始对象;对于不可变对象,函数内对参数的改变不会影响到原始参数。原因在于:可变对象,参数改变的是可变对象,其内容可以被修改。不可变对象,改变的是函数内变量的指向对象。 a = 1 d = [5] def A(a): a = 3 A(a) print(a) # 1 a是1(不可变对象)的引用,a存的是1的地址,调用A(a)的时候,会复制一份该引用,然后函数内是操作的复制的这一份引用,将其指向了3,与外面的引用没关系,外面的a还是指向1 # 字符串和tuple类似,tuple本身就是一旦初始化就不可以进行增删修改的。 def B(d): d = [6] #这里相当于是一个赋值操作,类似于 B(d) print(d) # [5] 这里是5是因为B(d)相当于对函数内部复制了一份外面的d,对新复制的d进行赋值,不会影响到外面的d def C(d): d[0] = 2 # [2] 这里是2是因为C()方法里面并不是去创建了一个新的变量d而是对原先的d进行修改,而之所以能对原先的d进行修改就是因为list是可变对象 C(d) print(d) #为什么上面B()运行了输出还是5而下面C()运行了却变为了2呢?我想是因为上面B函数传进去的是d,同样会复制d,函数内部操作复制的这一份,内部的确实变为了[6],但外部的d并没有改变,但是在C函数中,并没有创建新的d,而是原先的d的进行了修改。 #总结:重新分配一个对象,是不会改变实参的,但是对对象进行修改,是可以改变实参的。 #可能有人又好奇了,为什么list是可变对象,而str不是呢,list可以遍历,而一个str也可以遍历,这里其实很简单,一个str虽然可以拆分为一个个char但是你不能去对单独的一个char进行修改,你可以试试p = 'www',虽然你可以打印出p[0],但是当你试图p[0] = 's',肯定就报错了。
以上,如有不足,欢迎指出。Thanks~!
阅读全文
1 0
- 关于Python参数传递时,传递可变对象(mutable)和不可变更对象(immutable)的误区
- python 中 值传递 引用传递 可更改(mutable)与不可更改(immutable)对象
- python参数传递问题与可变/不可变对象
- python中可变和不可变对象(复值,拷贝,函数值传递)
- python函数参数是值传递还是引用传递:取决于对象内容可变不可变
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
- python中数据类型(对象)的可变和不可变性
- JAVA中方法的值传递对参数(可变和不可变)的影响
- (python)可变对象/不可变对象
- 可更改(mutable)与不可更改(immutable)对象
- immutable和mutable对象(java)
- python的可变和不可变对象
- Java中mutable对象和immutable对象的区别
- python可变对象和不可变对象
- Python-可变对象和不可变对象
- 可变类和不可变类(Mutable and Immutable Objects)
- 第四章 基于对象的编程风格何谓mutable(可变)和const(不可变)
- python 可变参数传递
- ionic cordova run android 报Unable to start the daemon process的解决办法
- 1.1 JavaWeb开发环境搭建
- 【量化小讲堂-Python&Pandas系列21】「视频讲解」浅谈机器学习与量化投资
- js前端md5加密生成校验位,.net后端进行校验完整性
- postman中 form-data、x-www-form-urlencoded、raw、binary的区别
- 关于Python参数传递时,传递可变对象(mutable)和不可变更对象(immutable)的误区
- 10.MySQL 高级特性
- ssm框架-多对多之间的crud
- 【量化小讲堂-Python&Pandas系列22】最优雅的Python编程方式:Jupyter Notebook视频教程
- CentOS7使用firewalld打开关闭防火墙与端口
- 我们丢失了Model层
- Hibernate学习总结(一)
- springmvc配置文件:spring-mybatis.xml
- bLue的大写L