为什么python引用“不”是其字符串计数器部分?

时间:2019-07-25 16:40:04

标签: python-3.x

当两个对象指向同一引用时,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?

2 个答案:

答案 0 :(得分:2)

作为优化,CPython将“小整数”和“小字符串”“内在化”。 AFAIK,这不是语言的一部分,而是此特定实现的一部分。

启动CPython时,即使您的程序未引用整数对象,也会创建一系列整数对象。

因此,每次您说s = 5s变量仅成为对预分配整数对象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