Python中对象包含的三个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)
代码 | 输出 |
my_list=['20210105'] print("变量类型",type(my_list)) print("变量地址",id(my_list)) print("变量的值",my_list) | 变量类型 <class 'list'> 变量地址 2295910720136 变量的值 ['20210105'] |
1. is和==的区别
== :比较两个对象的值是否相等,相当于调用_eq_()方法,即a==b等同于a._eq_(b)
is :比较的是对象标识符,用来检测对象的标识符是否一致,即两个对象在内存中的地址是否一致,使用a is b的时候,相当于是id(a)==id(b)
代码1 | 输出1 | 代码2 | 输出2 |
data_1='20210105' data_2='20210105' print('值的判定',data_1==data_2) print('地址的判定',data_1 is data_2) | 值的判定 True 地址的判定 True | data_1='20210105' data_2='20210206' print('值的判定',data_1==data_2) print('地址的判定',data_1 is data_2) | 值的判定 False 地址的判定 False |
注意,我们可以发现,当变量相同时,值和地址的判定都是True,因为python为相同的比变量分配到相同的空间,而变量不相等时值和地址的判定都是False;
代码1 | 输出1 | 代码2 | 输出2 |
data_1=['20210105'] #可变变量 data_2=copy.deepcopy(data_1) #深拷贝 print('值的判定',data_1==data_2) print('地址的判定',data_1 is data_2) | 值的判定 True 地址的判定 False | data_1='20210105' #不可变变量 data_2=copy.deepcopy(data_1) print('值的判定',data_1==data_2) print('地址的判定',data_1 is data_2) | 值的判定 True 地址的判定 True |
说明:可以看出进行深拷贝后,虽然变量值相等,但变量的地址不同;
注意:进行深拷贝时,如果拷贝内容为可变变量,则进行内容拷贝,如果拷贝内容为非可变变量,则相当于浅拷贝,只是简单的引用,不会开辟新的内存空间;
2.isinstance() 与 type() 区别:
isinstance() 与 type() 区别:
-
type() 不会认为子类是一种父类类型,不考虑继承关系。
-
isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。
代码 | 输出 |
class A: pass class B(A): pass a=A() b=B() print(isinstance(a,A)) print(type(a)==A) print(isinstance(b,A)) print(type(b)==A) | True True True False |