对于Python对象有三个基本要素:id(身份标识)、type(数据类型)和value(值)
其中数据类型我们可以使用type()函数获取:
a="hello"
type(a)
<class 'str'>
a=1.1
type(a)
<class 'float'>
a=100
type(a)
<class 'int'>
==比较运算符,用来比较判断两个对象的value(值)是否相等
is同一性运算符,比较判断的是对象间的唯一身份标识(id)是否相同
下面例子定义一个列表a,b = a[:] 会创建一个新的列表 b(使用 [:] 可以复制一个列表的所有元素到另一个新的列表中)
a 和 b 会引用不同的列表对象,但它们的元素是相同的,使用id()函数可以输出对象的id值
>>> a=[1,2,3]
>>> b=a[:]
>>> a == b
True
>>> a is b
False
>>> id(a)
2257676587456
>>> id(b)
2257676587264
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
Python中的整数对象有一个小整数池,它会缓存一定范围内的整数对象以进行重用。默认情况下,范围是-5到256。
在下面实例中,当 a 和 b 被赋值为小于等于256的整数时,它们引用的是相同的整数对象。因此,a is b 的结果为 True,表示 a 和 b 引用了同一个对象。
然而,当 a 和 b 被赋值为大于256的整数时,它们引用的是不同的整数对象。因此,a is b 的结果为 False,表示 a 和 b 引用了不同的对象。
>>> a=100
>>> b=100
>>> a == b
True
>>> a is b
True
>>> b=1000
>>> a=1000
>>> a is b
False
>>> a == b
True
同样在python中还有一个字符串常量池(String Pool)的缓存机制,它的作用是当你创建一个字符串字面量时,编译器或解释器会先查看字符串常量池中是否已经存在相同值的字符串对象。如果存在,它会让新的字符串引用已有的对象,而不是重新创建一个新的对象。这样就可以复用相同值的字符串对象,节省了内存空间。在Python中,默认情况下,较短的字符串字面量会被存储在常量池中,以便复用。这个字符串常量池的实现是由Python解释器控制的,具体行为也可能受到解释器版本和执行环境的影响。
>>> a="hello.world"
>>> b="hello.world"
>>> a is b
False
>>> b="hello"
>>> a="hello"
>>> a is b
True
对于字典(dict)和集合(set)类型,它们是可变对象,每个对象都是独立的,即使内容相同也是不同的对象。
对于元组(tuple)和列表(list)类型,它们是不可变对象,当它们的内容相同时,Python会尝试共享同一个对象。但是,在示例中,使用了不同的赋值语句,导致即使内容相同,它们都是不同的对象。
>>> a={'name':'lisa', 'age':10}
>>> b={'name':'lisa', 'age':10}
>>> a == b
True
>>> a is b
False
>>> b=set("hello")
>>> a=set("hello")
>>> a == b
True
>>> a is b
False
>>> a = (1,2,3)
>>> b = (1,2,3)
>>> a is b
False
>>> a == b
True
>>> a=[1,2,3]
>>> b=[1,2,3]
>>> a is b
False
>>> a == b
True
>>> b=[1,2,3]
>>> a=b
>>> a is b
True
>>> a == b
True