tutorial - python符號




為什麼Python中沒有++和-運算符? (12)

明晰!

Python對於清晰度有很大的要求,並且沒有程序員可能正確地猜測--a的含義,除非他/她學習了具有該構造的語言。

Python也很多關於避免引發錯誤的構造,並且知道++運算符是缺陷的豐富來源。 這兩個原因足以讓Python中的那些運算符不足。

Python使用縮進來標記塊而不是語法方式(如某些形式的開始/結束包圍或強制性結束標記)的決定主要基於相同的考慮。

為了說明,請看2005年關於在Python中引入條件運算符 (在C: cond ? resultif : resultelse )的討論 。至少閱讀第一條消息和該discussion決定消息 (其中有幾個前體話題)。

瑣事: PEP經常提到的是“Python擴展建議” PEP 308 。 LC意味著列表理解 ,GE意味著生成器表達式 (如果這些讓你感到困惑,不要擔心,它們不是Python中少數幾個複雜的地方)。

為什麼Python中沒有++--運算符?


++運算符與+ =運算符不完全相同。 其實兩者的結果相同但使用有一些差異。 例如,您可以在三元條件中使用++運算符,for循環等,但不能使用+ =。 底部,我們覺得需要++和 - ,因為這個原因。


我寫的這個最初的答案是計算機民俗學的一個神話 :Dennis Ritchie所揭示的“歷史上不可能”,正如在致ACM通信編輯的信中指出的那樣2012年7月doi:10.1145/2209249.2209251

C增量/減量運算符是在C編譯器不太聰明的時候發明的,作者希望能夠指定應該使用機器語言運算符的直接意圖,這為編譯器節省了少量的周期可能會做一個

load memory
load 1
add
store memory

代替

inc memory 

並且PDP-11甚至分別支持對應於*++p*p++ “自動增量”和“自動遞增”指令。 如果非常好奇,請參閱手冊的第5.3節。

由於編譯器足夠聰明,可以處理內置於C語法中的高級優化技巧,它們現在只是語法上的便利。

Python沒有把意圖傳達給彙編程序的技巧,因為它不使用它。


也許更好的問題是問為什麼這些操作符存在於C中。K&R呼籲增加和減少操作符的“異常”(第2.8頁第46頁)。 簡介稱他們“更簡潔,更經常更高效”。 我懷疑這些操作總是出現在指針操作中的事實也在他們的介紹中起了一部分作用。 在Python中,可能已經決定嘗試優化增量是沒有意義的(事實上,我只是在C中做了一個測試,看起來gcc生成的程序集在兩種情況下都使用addl代替incl),並且沒有指針運算; 所以它將只是一個方法來做到這一點,我們知道Python討厭這個。


它只是這樣設計的。 遞增和遞減運算符只是x = x + 1快捷鍵。 Python通常採用一種設計策略來減少執行操作的替代手段的數量。 增量賦值是在Python中增加/減少運算符最接近的東西,甚至在Python 2.0之前它們都沒有被添加。


您可以使用

element = iter(data_list)
a = next(element)
b = next(element)
c = next(element)

我對Python為什麼沒有++運算符的理解如下:當你在python a=b=c=1寫入時,你會得到三個變量(標籤)指向同一個對象(該值為1)。 你可以通過使用id函數來驗證它,它將返回一個對象內存地址:

In [19]: id(a)
Out[19]: 34019256

In [20]: id(b)
Out[20]: 34019256

In [21]: id(c)
Out[21]: 34019256

所有三個變量(標籤)都指向同一個對象。 現在增加一個變量,看看它如何影響內存地址:

In [22] a = a + 1

In [23]: id(a)
Out[23]: 34019232

In [24]: id(b)
Out[24]: 34019256

In [25]: id(c)
Out[25]: 34019256

你可以看到變量a現在指向另一個對像作為變量bc 。 因為你已經使用a = a + 1所以清楚明確。 換句話說,您完全分配另一個對象來標記a 。 想像一下,你可以寫a++它表明你沒有分配給變量a新的對象,但喋喋不休舊的。 所有這些東西是恕我直言,最大限度地減少混亂。 為了更好地理解python變量是如何工作的:

在Python中,為什麼函數可以修改調用者感知的某些參數,而不是其他參數?

Python是按值調用還是按引用調用? 都不是。

Python是按值傳遞還是通過引用傳遞?

Python是通過引用還是按值傳遞?

Python:我如何通過引用傳遞變量?

了解Python變量和內存管理

在python中模擬傳值的行為

Python函數按引用調用

代碼就像Pythonista:習慣Python


我對Python非常陌生,但我懷疑原因是因為語言中可變和不可變對象之間的重點。 現在,我知道x ++很容易被解釋為x = x + 1,但它看起來像是在增加一個可能不可變的對象。

只是我的猜測/感覺/預感。


正如我所理解的那樣,所以你不會認為內存中的價值發生了變化。 在c中,當你做x ++時,x在內存中的值發生變化。 但在python中,所有數字都是不可變的,因此x指向的地址仍然有x不是x + 1。 當你編寫x ++時,你會認為x改變真正發生的事情是x refrence被改變為存儲x + 1的存儲位置,或者如果doe不存在,則重新創建該位置。


當然,我們可以說“圭多只是這樣決定的”,但我認為這個問題真的是這個決定的原因。 我認為有幾個原因:

  • 它將語句和表達式混合在一起,這不是很好的做法。 請參閱http://norvig.com/python-iaq.html
  • 它通常會鼓勵人們編寫較少可讀的代碼
  • 正如已經提到的那樣,語言實現中的額外複雜性在Python中是不必要的

這不是因為它沒有意義; 將“x ++”定義為“x + = 1,評估以前的x綁定”是非常有意義的。

如果你想知道最初的原因,你必須通過舊的Python郵件列表或者詢問有人在那裡(例如Guido),但是很容易證明事實是正確的:

簡單的遞增和遞減不像其他語言那樣需要。 你不會像Python那樣經常寫for(int i = 0; i < 10; ++i) ; 相反,你for i in range(0, 10)for i in range(0, 10)喜歡for i in range(0, 10)事情。

由於它幾乎不經常需要,所以給它自己特殊的語法的理由就少得多; 當你需要增加時, +=通常很好。

這不是一個決定它是否合理,或者它是否可以完成 - 它的確如此,也可以。 這是一個問題,是否值得添加到語言的核心語法中。 請記住,這是四個運算符 - postinc,postdec,preinc,predec,每個都需要有它自己的類重載; 他們都需要指定和測試; 它會將操作碼添加到語言中(這意味著更大,因此速度更慢,VM引擎); 每個支持邏輯增量的類都需要實現它們(在+=-=之上)。

這與+=-=都是多餘的,所以它會成為淨虧損。


這可能是因為@GlennMaynard正在研究與其他語言相比的問題,但是在Python中,您是以python的方式執行的。 這不是一個'為什麼'的問題。 它在那裡,你可以用x+=做同樣的事情。 在Python的禪宗中 ,它給出了:“應該只有一種方法來解決問題。” 藝術(表達自由)方面有多種選擇,但在工程上很糟糕。







operators