python 学习之 对象的比较和拷贝以及python中的参数传递
2019-06-22 16:00
369 查看
值比较(==) 与 对象比较(is)
- 简单说明
== 和 is 时python中常用的两种比较方式 其中前者是比较对象之间的值是否想等,而is 是比较两个对象的身份标示是否相等,即他们是不是同一个对象 是不是指向同一块内存地址。 - 举例说明
a = 10 b = 10 a == b #True 此处a b的值相等 id(a) #4427562448 id(b) #4427562448 a is b #True id也相等 说明在同一块内存地址 a = 257 b = 257 a == b #True id(a) #4473417552 id(b) #4473417584 a is b #False 此处id不同的原因是 python为了优化 缓存了-5-256 之间的数 为了提高效率
通常情况下 python 中is的比较效率要比 ==的高 因为使用 = =相当于是调用__eq__方法 python中大部分的数据类型都会重载这个方法 故而调用会复杂一些
浅拷贝和深拷贝
- 浅拷贝 举例说明 python 中的浅拷贝使用的是数据类型本身的构造器
l1 = [1,2,3] l2 = list(l1) l1 == l2 # true l1 is l2 # false 此处可以发现 浅拷贝下 l1 和 l2 是两个不同的引用 只是copy了原对象的保存的指针引用
- python 中的浅拷贝函数 copy.copy()
import copy l1 = [1, 2, 3] l2 = copy.copy(l1)
- python 中的深拷贝 函数 copy.deepcopy()
深拷贝 顾名思义 是创建了一个新的对象 和原来的没有任何关系
总结 其实不管是浅拷贝还是深拷贝我们都要定位到要拷贝的那块内存地址 对于浅拷贝来说 如果待拷贝的对象是不可变的 那还好说 如果是可变的话 还好 如果可变一定要注意 拷贝出来的对象只是保存着原有的指针,会相互影响。
python 中的参数传递
先看几个简单的例子
a = 1 id(a) 4349138272 a += 1 id(a) 4349138304 对于不可变对象 他的改变都会生成一个新的对象出来
不可变对象的参数传递
def my_func2(b): b = 2 return b a = 1 my_func2(a) a 1 这个方法的执行指挥改变b 不会改变a 除非将返回值 再次赋值给a
可变对象的参数传递
def my_func3(l2): l2.append(4) l1 = [1, 2, 3] my_func3(l1) l1 [1, 2, 3, 4] 此处的l2的改变影响到了l1
总结 python中的参数传递即不是引用传递也不是值传递 是赋值传递
如果对象是可变的 那么当其改变时 指向这个对象的变量都会改变
如果对象是不可变的,简单的赋值操作只能改变当前改变的变量 其他的不变。
相关文章推荐
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
- python学习-Day3-pycharm传递参数以及调试功能
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
- (基本数据类型值+对象)参数传递方式+对象的引用和拷贝
- JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递
- Python的学习(二十四)-- 参数传递
- JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递
- Python学习之函数参数传递:传值 or 引用 ?
- python面向对象类学习以及异常
- java学习笔记(四)----对象、数组作为参数传递,静态变量、静态方法的使用,内部类,使用文档注释
- 【python学习笔记】python中的模块,类,函数,对象,实例(与JAVA的比较)
- JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递
- python第七天学习记录——面向对象高级以及socket编程
- python知识点1之引用、拷贝、函数参数传递、实例调用了类变量
- python的可变对象和不可变对象以及浅层拷贝与深层拷贝
- caffe的python接口学习(12):查看属性、方法以及函数参数
- python中的对象拷贝示例 python引用传递
- JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递
- 对象作为参数传递的练习 学习笔记
- JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递