換句話說是python賦值嚴格從右到左進行評估嗎?
d = {}
d["key"] = len(d)
在Python
安全嗎?
我知道這是undefined behaviour in C++;程序可能會在計算要分配給它的值之前獲取元素的引用。這是類似的Python還是len(d)
總是在d.__getitem__("key")
之前計算?
換句話說是python賦值嚴格從右到左進行評估嗎?
d = {}
d["key"] = len(d)
在Python
安全嗎?
我知道這是undefined behaviour in C++;程序可能會在計算要分配給它的值之前獲取元素的引用。這是類似的Python還是len(d)
總是在d.__getitem__("key")
之前計算?
是,在Python它是安全的:一個表達是由左到右的評估順序,但在一個賦值語句轉讓發生前右側進行評估。另外一個算術表達式按其後綴的算術順序進行評估。
Python從左至右計算表達式。請注意,雖然 評估分配,但右側在 左側之前評估。
在下面的行,表達式將在其後綴的 算術順序進行評估:
是,分配的RHS在LHS之前評估;無論LHS是屬性引用,訂閱還是切片,都是這種情況。
從https://docs.python.org/3/reference/simple_stmts.html#assignment-statements:
賦值語句計算表達式列表(記住,這可以是單個表達式或逗號分隔的列表,後者產生的元組)和單一的所得對象分配給每個的目標列表,從左到右。
在節中的後續語言討論如何分配到不同的目標語法被定義,但是從該表達式列表已經被評估以產生對象的觀點來看這樣做。
事實上,LHS內的評估順序也是定義的;下標前的容器被評估:
- 如果目標是一個訂閱:在引用中的主表達式。它應該產生可變序列對象(如列表)或映射對象(如字典)。接下來,評估下標表達式。
如果你的意思是有機會你會看到1作爲價值,那麼沒有。它也有很好的文檔記錄 –
是的,這在python中是安全的 – sage88
請注意,如果您的受衆是Python程序員,您的問題的表達方式並非意味着您的意圖。在Python中,在評估f(z)之前,你可以做'a,b,c = f(x),f(y),f(z)'和'f(x)'的評估。 (如果該功能有副作用,則這是相關的。)因此,右側的評估*是**從左到右**。但是在與LHS綁定之前,RHS總是被評估。 –