s 与 == 区别 :
is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。
a is b 相当于 id(a)==id(b), id() 能够获取对象的内存地址。
如果 a=10;b=a; 则此时 a 和 b 的内存地址一样的;
但当 a=[1,2,3]; 另 b=a[:] 时,虽然 a 和 b 的值一样,但内存地址不一样。
如果此时定义 a=10、b=10, 然后再对比 a is b 会发现返回的结果是 True,这是因为在 Python 中会实现创建一个小型的整形池,范围为 [-5,256],为这些整形开辟好内存空间,当代码中定义该范围内的整形时,不会再重新分配内存地址。而我在 Pycharm 中进行测试:
#coding=utf-8
a
=
100000000000
;
b
=
100000000000
;
print
a
is
b
结果:
True
后来查了资料才发现是:Python出于对性能的考虑,但凡是不可变对象,在同一个代码块中的对象,只有是值相同的对象,就不会重复创建,而是直接引用已经存在的对象。
>>> a = 1
#
a和b为数值类型
>>> b = 1
>>> a
is
b
True
>>>
id(a)
>>>
id(b)
>>> a =
'
cheesezh
'
#
a和b为字符串类型
>>> b =
'
cheesezh
'
>>> a
is
b
True
>>>
id(a)
>>>
id(b)
>>> a = (1,2,3)
#
a和b为元组类型
>>> b = (1,2,3
)
>>> a
is
b
False
>>>
id(a)
>>>
id(b)
>>> a = [1,2,3]
#
a和b为list类型
>>> b = [1,2,3
]
>>> a
is
b
False
>>>
id(a)
>>>
id(b)
>>> a = {
'
cheese
'
:1,
'
zh
'
:2}
#
a和b为dict类型
>>> b = {
'
cheese
'
:1,
'
zh
'
:2
}
>>> a
is
b
False
>>>
id(a)
>>>
id(b)
>>> a = set([1,2,3])
#
a和b为set类型
>>> b = set([1,2,3
])
>>> a
is
b
False
>>>
id(a)
>>> id(b)
只有数值型和字符串型的情况下,a is b才为True,当a和b是tuple,list,dict或set型时,a is b为False。

