一. 对象的身份和类型
1. 内置函数 id() 可以返回一个对象的唯一标识,返回值为整型,用于比较该对象在内存中的位置,在Python中,一切都是对象,比如创建一个值为1的对象,a只是引用这个新创将对象的一个名称,将a赋值给b时,b就成了同一对象的另一个名称,a和b的唯一标识都是相同的,使用sys模块的getrefcount可以获取引用计数,改变a并不会影响到b。
import sys
a=1
b=1 #或者使用del 删除对象
print(id(a))
print(id(b)) #删除了对象将引发异常
print(sys.getrefcount(a))
b=2
print(sys.getrefcount(a))
140274625986568
140274625986568
597
596
2. 比较对象
< | 严格小于 |
<= | 小于或者等于 |
> | 大于 |
>= | 大于或者等于 |
== | 等于 |
!= | 不等于 |
is | 比较对象连个对象的身份 |
is not | 否定对象的身份 |
除了不同的数字类型,不同类型的对象永远不会相等。
def cmp(a,b):
if a is b: #比较两个对象的身份,也就是id()
print("a is b")
if a==b: #比较连个对象的值
print("a==b")
if type(a)==type(b): #比较连个对象的类型
print("type equal")
cmp(1,2)
type equal
3.引用和复制
在程序进行a==b的后,a和b就是引用了同一个对象,修个其中一个就会影响到另一个对象,为避免这种情况,必须创建对象的副本而不是新的引用,对于列表和字典这样的容器,可以使用两种复制操作,浅复制和深复制,浅复制会创建一个新的对象,但它包含的是对原始数据的引用
#深复制
import copy
a=[1,2]
b=copy.deepcopy(a)
b[0]=3
print(b)
print(a)
[3,2]
[1,2]
#浅复制
a=[1,2]
b=a
b[0]=3
print(a)
[3,2]
3. Python中所有对象都是第一类,意思是能够使用标识符命名所有对象都具有的相同状态,也就是说能够命名的所有对象都可以当错数据处理
items={}
items["abs"]=abs;
print(items["abs"](-1))
将一行文本转换为列表
line="Good,100,1.3"
types=[str,int,float]
fields=line.split(",")
print(fields)
result=[i(j) for i,j in zip(types,fields)]
print(result)
['Good', '100', '1.3']
['Good', 100, 1.3]