2016-04-28 45 views
0

我正在爲Python編寫一些正式的語義。希望有些Python大師能幫助我。隨着程序執行向下移動到語句列表中,它遇到的每個賦值語句(或表達式)都會根據上下文來推斷類型。但是它會在某處存儲此類型(所以下次遇到它時可以檢查存儲和檢查類型),還是執行操作,然後丟棄類型,然後在下一次遇到變量時再次推斷類型? 這是Python 3 + btw (希望我已經明確)Python的語義和狀態

+3

你是什麼意思*它推斷基於上下文的類型*? – bereal

+0

那麼如果有一個變量a ..並且語句是a = 2 ..那麼它推斷出一個類型是integer ..或者如果它是「a = 2 + 2.2」,那麼通過上下文它推斷出一個類型漂浮 –

+0

以及它沒有多少推測將整數看作一個整數。它不是推斷任何東西,因爲它是如何在python中定義整數的,就像'int a = 10;'的強定義一樣,如果你希望它是非整數的東西,那麼你必須像在任何其他語言中一樣聲明它。只有浮點數,整數,字符串,字節,元組,列表,字典和虛數具有速記聲明 – joojaa

回答

1

Python使用動態類型。該類型是價值的一部分。無論價值何去何從,它的類型都會隨之而來。 (您可以使用type()函數獲得與該類型相對應的獨立值。)只有當整個值被丟棄時纔會丟棄值的類型。變量只是對值的引用:每個變量恰好指向一個值,通常它可以是任何可能的值,對類型沒有限制。

例如,在

a = 2 

Python不使a一個int變量; 2是什麼類型inta只是對2的引用,它恰好是一個整數。當你再寫入

b = a + 3 

Python中通過簡單地獲得通過a所指的價值,然後獲得的該類型得到的a類型。評估表達式並將結果存儲在b中。

從靜態類型語言的角度來看,就好像Python中的每個變量都具有相同類型,因此每個變量都包含一個值。

有關靜態和動態類型的更多信息,請參閱this other question

+0

因此,在Java中存在知道對象類型的存儲區或狀態。所以你不能說「int i = 1 .... i = true」,因爲我的類型是int ...在Python中,你可以這樣做,因爲它會重新聲明變量。所以沒有這樣的狀態,從你的答案我得到的想法「a = 2」.. 2是存儲在內存地址a指向。然後當我對a執行操作時,它查找地址,看到a的類型是整數,然後評估操作? –

+0

對,變量在Python中沒有像Java那樣的類型。在設置之前也不需要聲明它們。這組變量的作用非常像Java中的Map 。 (事實上​​,你可以通過調用'vars()'來得到一個非常像這個圖的值)。 –

+0

這個混淆是我在Python中更喜歡「變量」這個術語的原因。 「變量」這個詞使它看起來像是某種東西,而不是對某物的引用。 –