2013-10-13 88 views
0

所以,让我们通过我们所知道的:为什么Python将单个字符串计数为相同?

  1. is运营商身份进行比较,而不是价值,而不是在==运营商。
  2. Python实习生字符串文字,所以"hello" is "hello"True

所以我不明白的是这种行为:

>>>'h' is input() 
h 
True 
>>>'hj' is input() 
hj 
False 

单个字符被算作是相同的,即使他们不是两个字符串常量,而两个字符的字符串给我我期望的结果是不一致的。

由于input()函数动态地创建一个字符串,所以结果不会被拦截,这就是为什么'hj'和动态创建的'hj'不相同的原因。但为什么'h'和动态'h'相同?

这是否意味着Python缓存/实习生所有长度为1的字符串?

+0

不是重复! – Aerovistae

+0

@Aerovistae:你能解释为什么不呢? – Eric

+0

另一个答案没有深入研究为什么单个字符串在所有情况下都是相同的,即使在动态创建时,这也是问题。另一个答案解释了字符串身份测试通常如何工作。 – Aerovistae

回答

6

From the source code

PyObject * 
PyString_FromStringAndSize(const char *str, Py_ssize_t size) 
{ 
    // ... 
    if (size == 1 && str != NULL && 
     (op = characters[*str & UCHAR_MAX]) != NULL) 
    { 
     Py_INCREF(op); 
     return (PyObject *)op; 
    } 
    // ... 
} 

CPython的实习生characters阵列中的所有单个字符串。

+0

优秀。这正是我希望看到的。 – Aerovistae

1

identicalequal不同。 identical意味着它们具有相同的内存地址(所以当然除非有废话__eq____cmp__他们也必须相等)

Python语言不指定字符串时应该或不应该占用相同的内存地址。由于字符串是不可变的,实现可以选择“实习生”他们作为优化

在pypy例如

Python 2.7.2 (1.9+dfsg-1, Jun 19 2012, 23:23:45) 
[PyPy 1.9.0 with GCC 4.7.0] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
And now for something completely different: ``<fijal> I love pypy'' 
>>>> 'h' is raw_input() 
h 
False 
+0

我知道......我在问为什么'h'和动态创建'h'是相同的,但不是'hj'和动态创建'hj'。 – Aerovistae

+0

虽然'id(x)== id(y)'不一定暗示'x == y',给出一个适当的荒谬的'__eq__' – Eric

+0

@Eric,试试“x = float(”NaN“); y =×”。然后x和y(显然)具有相同的'id()',但'x == y'是'False'。责备IEEE 754 ;-) –

相关问题