2012-08-03 41 views
13

可能重複:
accessing a python int literals methods整數文字是Python中的一個對象嗎?

在Python一切都是對象。即使是數是一個對象:

>>> a=1 
>>> type(a) 
<class 'int'> 
>>>a.real 
1 

我嘗試以下,因爲我們應該能夠訪問對象的類成員:

>>> type(1) 
<class 'int'> 
>>> 1.real 
    File "<stdin>", line 1 
    1.real 
     ^
SyntaxError: invalid syntax 

爲什麼這個不行?

+3

這是一個語法錯誤。編譯器不理解語法。語法語法(其語法)未定義,因此您可以在整數後輸入方法名稱。程序運行時這不是錯誤,而是程序運行前的*。解析器無法理解您輸入的內容。 – 2012-08-03 19:46:37

+0

@andrewcooke - 我認爲這個問題(通過這種方式表現得很好)是*爲什麼解析器不能處理這個問題?您可以訪問屬性/方法對其他類型的文本(考慮共同'「」。加入(...)',爲什麼不整數? – mgilson 2012-08-03 19:48:30

+0

它確實做的,但我認爲人問這個問題的主要擔憂是,不知怎的,這意味着整數沒有對象(見來自同一用戶http://stackoverflow.com/questions/11801549/python-data-types-are-classes-or-data-structures)。因此,我強調這是怎麼回事從單獨的,較早的層。 – 2012-08-03 19:54:20

回答

18

是的,整數文字是Python中的對象。總而言之,解析器需要能夠理解它正在處理一個integer類型的對象,而語句1.real會將解析器混淆成它認爲它有一個浮點數1.後跟real這個字,因此會引發語法錯誤。

爲了測試這一點,你也可以嘗試

>> (1).real 
    1 

以及,

>> 1.0.real 
    1.0 

所以在1.real蟒蛇的情況下被解釋爲.一個小數點。

編輯

BasicWolf所說很好太 - 1.被解釋爲1的浮點表示,所以1.real相當於寫入(1.)real - 因此沒有屬性訪問運算符即週期/句號。因此,語法錯誤。

進一步編輯

至於mgilson暗示在他/她的評論:解析器可以處理訪問int的屬性和方法,但只能作爲長期的聲明清楚地表明,正在給予它int而不是float

+13

'1 .real'中也可以(和'1..real'浮子)。 – 2012-08-03 19:41:58

+6

的原因是,當Python看到的位數一些數,然後一個週期,它把它作爲一個小數點並希望它是一個浮動ETA:對,你得出了相同的結論 – 2012-08-03 19:43:24

+1

+1,但你可能要一個明確的答案添加到混亂的標題:是的,文字的整數是一個對象,這不是原因。 '1.real' is failing。 – abarnert 2012-08-03 20:21:43

7

雖然與1.real的行爲似乎unlogical,預計由於語言規範:Python的解釋1.爲float(見floating point literals)但作爲@mutzmatron指出(1).real使用,因爲在括號中的表達式是有效的Python對象。

更新:請注意以下坑:

1 + 2j.real 
>>> 1.0  # due to the fact that 2j.real == 0 
# but 
1 + 2j.imag 
>>> 3.0  # due to the fact that 2j.imag == 2 
+0

'1 + 2j.real'只能偶然使用,相當於'1 +(2j.real)',它總是等於'1 + 0'。 – 2012-10-22 12:40:05

+0

謝謝你,補充@lazyr! – 2012-10-22 12:56:24

2

您仍然可以訪問1.real:

>>> hasattr(1, 'real') 
True 
>>> getattr(1, 'real') 
1 
7

一種語言通常建立在三層。

當您將程序提供給首先必須「讀取」該程序的語言時。那麼它就會將它所讀的內容構建成可以使用的東西。最後它將這個事情作爲「一個程序」來運行,並且(希望)會打印一個結果。

這裏的問題是python的第一部分 - 讀取程序的部分 - 很困惑。這是困惑,因爲它不是足夠聰明,知道

1.234 

1.letters 

什麼似乎是發生的是,它認爲你試圖輸入一個數字,如1.234,但犯了一個錯誤的區別鍵入字母改爲(!)。

所以這與1「真的是」無關,以及它是否是一個對象。所有這些邏輯都發生在我之前描述的第二和第三階段,當python嘗試構建並運行程序時。

你發現的東西只是一個奇怪的(但有趣的!)皺紋如何python讀取程序。

[我會說它是一個錯誤,但它可能是這樣的原因。事實證明,有些東西很難讓電腦讀取。 python可能是爲了讓計算機讀取程序很容易(快速)而設計的。修復這個「bug」可能會讓python的一部分讀取程序變得更慢或更復雜。所以它可能是一個權衡。]

+0

+1,並鏈接到維基百科的文章[詞法(http://en.wikipedia.org/wiki/Lexical_analysis),什麼是第一步通常被稱爲。 – Izkata 2012-08-04 03:40:13

相關問題