2015-04-20 53 views
4

換句話說是python賦值嚴格從右到左進行評估嗎?

d = {} 
d["key"] = len(d) 
在Python

安全嗎?

我知道這是undefined behaviour in C++;程序可能會在計算要分配給它的值之前獲取元素的引用。這是類似的Python還是len(d)總是在d.__getitem__("key")之前計算?

+0

如果你的意思是有機會你會看到1作爲價值,那麼沒有。它也有很好的文檔記錄 –

+0

是的,這在python中是安全的 – sage88

+0

請注意,如果您的受衆是Python程序員,您的問題的表達方式並非意味着您的意圖。在Python中,在評估f(z)之​​前,你可以做'a,b,c = f(x),f(y),f(z)'和'f(x)'的評估。 (如果該功能有副作用,則這是相關的。)因此,右側的評估*是**從左到右**。但是在與LHS綁定之前,RHS總是被評估。 –

回答

7

是,在Python它是安全的:一個表達是由左到右的評估順序,但在一個賦值語句轉讓發生前右側進行評估。另外一個算術表達式按其後綴的算術順序進行評估。

5.14. Evaluation order

Python從左至右計算表達式。請注意,雖然 評估分配,但右側在 左側之前評估。

在下面的行,表達式將在其後綴的 算術順序進行評估:

1

是,分配的RHS在LHS之前評估;無論LHS是屬性引用,訂閱還是切片,都是這種情況。

https://docs.python.org/3/reference/simple_stmts.html#assignment-statements

賦值語句計算表達式列表(記住,這可以是單個表達式或逗號分隔的列表,後者產生的元組)和單一的所得對象分配給每個的目標列表,從左到右。

在節中的後續語言討論如何分配到不同的目標語法被定義,但是從該表達式列表已經被評估以產生對象的觀點來看這樣做。

事實上,LHS內的評估順序也是定義的;下標前的容器被評估:

  • 如果目標是一個訂閱:在引用中的主表達式。它應該產生可變序列對象(如列表)或映射對象(如字典)。接下來,評估下標表達式。