2017-07-07 56 views
9

在文檔上built-in constants(不含site常數),它指出:爲什麼6個內置常量中的2個是可分配的?

Note: The names None , False , True and __debug__ cannot be reassigned (assignments to them, even as an attribute name, raise SyntaxError), so they can be considered 「true」 constants.

如果我沒有記錯,TrueFalse在Python 3就成了「真」 contants(如重複的也有描述。 )

問題是,爲什麼不是另外兩個(EllipsisNotImplemented)「真正的」contants?是否有用於重新分配這些(numpyEllipsis也許?)的用例已經免除了它們的限制?

加重我的困惑,在standard library types的文檔中,EllipsisNotImplemented類型在行爲上與None類型相同。即:

  • 他們是單身
  • 它們不支持特殊操作。

這個問題是不相關的建議重複:Why were True and False changed to keywords in Python 3。它要求完全不同的東西,即爲什麼EllipsisNotImplemented不是「真」常量而不是爲什麼TrueFalse其中變成了1。

+1

所以這裏是我的觀點:肯定沒有用於覆蓋任何**內建對象的用例。任何此類代碼應被視爲危險。另一方面,使它們成爲所有關鍵詞將會使它難以維護(在C端)。所以我想它是Python演變的一個問題。此外,「無」,「假」和「真」被一直使用,所以特別關注它們。 – freakish

+4

有趣的是,'Ellipsis = 2'沒有問題,但'... = 2'提高'SyntaxError:不能分配到省略號'。 –

+0

@freakish這是一個意見。當然,Python只是簡單地喜歡(特別是在簡化了向Python 3過渡的事情之後),我看不出如何維護其他兩個名稱的額外複雜性會如何影響行爲相同的內容的一致性。這就是爲什麼我認爲必須有一些用例。 –

回答

3

您可以分配給任何不是關鍵字的有效標識符。 TrueFalseNone是什麼是它們是都是的關鍵字和標識。你可以閱讀關於這個問題的理由爲:

Why were True and False changed to keywords in Python 3

內置命令如NotImplementedEllipsis沒有特殊情況,也不是intlisttype等。分配到NotImplemented不會更改內置常量。相反,您將名稱Ellipsis綁定到當前範圍中的一個不同值。原來的Ellipsis沒有改變。

分配給關鍵字是一個SyntaxError。

您可以通過導入keywords模塊來查看關鍵字列表。

>>> import keyword 
>>> keyword.kwlist 

['False', 
'None', 
'True', 
'and', 
'as', 
'assert', 
'break', 
'class', 
'continue', 
'def', 
'del', 
'elif', 
'else', 
'except', 
'finally', 
'for', 
'from', 
'global', 
'if', 
'import', 
'in', 
'is', 
'lambda', 
'nonlocal', 
'not', 
'or', 
'pass', 
'raise', 
'return', 
'try', 
'while', 
'with', 
'yield'] 

有很多內建的標識符不在該列表中,您可以指定新的值intEllipsis

...是一個特例,因爲它不是一個有效的標識符名稱第一個地方,所以它不可能分配給。

與許多其他語言相比,Python保留保留關鍵字的列表非常短。原因之一可能是與代碼保持向後兼容性,因爲代碼在成爲該語言的一部分之前使用了諸如Ellipsis之類的標識符。

+2

我明白,不允許分配給關鍵字。問題不在於爲什麼將錯誤分配給「True」,相反,這就是爲什麼在可指定時,省略號和未實現位被指定爲「常量」的原因。向後兼容性當然是一個問題,但是從2到3的轉換將允許這樣的改變,就像'True'和'False'一樣。 –

+0

即使您將名稱分配給當前範圍中的某個其他值,原始內置常量也不會改變。 –

+1

是的,我瞭解綁定是如何工作的。這仍然不回答*爲什麼*您可以重新綁定(分配)上述名稱。 –

相關問題