2013-10-13 91 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 ;-) –

相關問題