0x00 is与==
==运算符是比较两个对象的内容是否相等,默认情况是调用对象的__eq__方法进行比较;而is是比较两个对象是否一样,它比较的两个对象的id,即它们的内存地址是否相同。
>>> a = [1,2,3] >>> b = [1,2,3] >>> a == b True # a和b是否是同一个对象 >>> a is b False # a和b的地址其实是不一样的 >>> id(a) 4498717128 >>> id(b) 4446861832
在比较时但也有例外。Python对一些常用的值进行缓存优化,例如在区间[-5,256]的整数,它们在创建时,无论创建多少个对象,它们的id是一样的,即它们在底层中只保存一份内存。
>>> a = -5 >>> b = -5 >>> a == b True >>> a is b True >>> a = -6 >>> b = -6 >>> a == b True >>> a is b False
对一些短的字符串也是如此,因此并不是所有字符串都会创建新的实例
>>> a='123' >>> b='123' >>> a==b True >>> a is b True >>> id(a) 4446903800 >>> id(b) 4446903800 >>> x = 'long char' >>> y = 'long char' >>> x == y True >>> x is y False
0x01 __repr__与__str__
每个类都应该提供一个__repr__方法。__repr__方法和__str__方法有什么不一样呢?
简单的说,__repr__可以反映一个对象的类型以及包含的内容,而__str__主要是用于打印一个对象的内容。例如看一下Python中的日期类datetime
import datetime >>> today = datetime.date.today() >>> today datetime.date(2019, 7, 7) >>> print(today) 2019-07-07 >>> str(today) '2019-07-07' >>> repr(today) 'datetime.date(2019, 7, 7)'
__str__在字符串连接,打印等操作会用到,而__repr__主要是面向开发者,它能反馈的信息比较多,例如在交互环境下输入today这个变量会打印出datetime.date(2019, 7, 7
本文来源gaodai.ma#com搞##代!^码@网*
),不仅可以看出today代表的是今天的日期信息,还可以看出它的类型信息。更重要的是你可以直接复制这段打印出来的信息,直接构造一个“相同”的对象出来。
例如
>>> now = datetime.date(2019, 7, 7) >>> now datetime.date(2019, 7, 7)
0x02 对象复制
对象的复制或说对象拷贝可以分为浅拷贝和深拷贝。
浅拷贝与深拷贝
我们通过代码来说明,就很好理解
如果要拷贝的对象是基本数据类型,那么深拷贝和浅拷贝的区别不是很大。
>>> a = [1,2,3] >>> b = list(a) >>> a[1]=200 >>> a [1, 200, 3] >>> b [1, 2, 3]
修改a中的元素并不会影响到b
但如果要拷贝的对象包含了另一个对象,那么就要考虑深拷贝和浅拷贝的问题了。
>>> a = [[1,2,3],[4,5,6],[7,8,9]] >>> b = list(a) >>> a == b True >>> a is b False
这里有一个列表a,里面有三个子列表,即列表里包含的是对象。