当两个对象指向同一引用时,Python的is
运算符返回true。
考虑到这一点,我进行了一些测试,并针对各种s
值获得了以下结果。
# I set s to "a", 5, "hello", and "hello there"
s is "a" => True
s is 5 => True
s is "hello" => True
s is "hello there" => False
为什么最后一个返回false?
答案 0 :(得分:2)
作为优化,CPython将“小整数”和“小字符串”“内在化”。 AFAIK,这不是语言的一部分,而是此特定实现的一部分。
启动CPython时,即使您的程序未引用整数对象,也会创建一系列整数对象。
因此,每次您说s = 5
,s
变量仅成为对预分配整数对象5
的引用。
例如:
In [14]: for i in range(10):
...: print(i, id(i))
...:
0 34375408656
1 34375408688
2 34375408720
3 34375408752
4 34375408784
5 34375408816
6 34375408848
7 34375408880
8 34375408912
9 34375408944
即使在不同的CPython会话中,这些ID也保持不变。 (这是在64位UNIX上;其他计算机上的数字可能有所不同。但是即使在不同的CPython会话中,它们也应该相同)
比较:
In [1]: s = "hello there"
Out[1]: 'hello there'
In [2]: id(s)
Out[2]: 34513947376
In [3]: id("hello there")
Out[3]: 34517432752
In [4]: id("hello there")
Out[4]: 34527873968
In [5]: id("hello there")
Out[5]: 34518225712
In [6]: id("hello there")
Out[6]: 34512957808
显然,字符串hello there
对于这种内部化机制来说太长了,因此每个实例都是一个新实例。
答案 1 :(得分:1)
您的问题尚不清楚,但听起来您正在执行以下操作:
for s in [ 'a', 5, 'hello', 'hello there' ]:
print(s is 'a')
print(s is 5)
print(s is 'hello')
print(s is 'hello there')
对吗?
在后台,python“实习生”小整数,长度为0和1的字符串以及看起来像标识符的字符串(即,它们由字母,数字和下划线组成)是一种优化。因此,列表中的前三个对象已成功插入并且实际上可以直接在print语句中重用(所以=> True),而最后一个对象(“ hello there”)缺少内部逻辑,并且在对象内部和外部分别创建。循环(所以=> False)。
这里有一篇关于实习的有趣文章: Python Interning Description