您的位置:首页 > 编程语言 > Python开发

python 学习之 对象的比较和拷贝以及python中的参数传递

2019-06-22 16:00 369 查看

值比较(==) 与 对象比较(is)

  1. 简单说明
    == 和 is 时python中常用的两种比较方式 其中前者是比较对象之间的值是否想等,而is 是比较两个对象的身份标示是否相等,即他们是不是同一个对象 是不是指向同一块内存地址。
  2. 举例说明
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中大部分的数据类型都会重载这个方法 故而调用会复杂一些

浅拷贝和深拷贝

  1. 浅拷贝 举例说明 python 中的浅拷贝使用的是数据类型本身的构造器
l1 = [1,2,3]
l2 = list(l1)
l1 == l2 # true
l1 is l2 # false
此处可以发现 浅拷贝下 l1 和 l2 是两个不同的引用 只是copy了原对象的保存的指针引用
  1. python 中的浅拷贝函数 copy.copy()
import copy
l1 = [1, 2, 3]
l2 = copy.copy(l1)
  1. 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中的参数传递即不是引用传递也不是值传递 是赋值传递
如果对象是可变的 那么当其改变时 指向这个对象的变量都会改变
如果对象是不可变的,简单的赋值操作只能改变当前改变的变量 其他的不变。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐