為什麼 Python Ruby 等語言棄用了自增運算子?

時間 2021-05-14 18:25:15

1樓:XIVN1987

1、容易替代

n++很容易被替代為:

n += 1

2、功能有限

只能實現自增1,想要自增2怎麼辦?還不是得寫成:

n += 2

所以乾脆去掉自增用+=替代算了

2樓:路公尺

關於Ruby的這個特性,松本先生本人解釋過這個問題:

[ruby-list:126] Re: i++ ????

我們先預設 i 是乙個Integer。如果要在Ruby裡面實現 i++ 的話,按照Ruby的風格應該被理解成是『向 i 所指的物件傳送++訊息,該物件的值變為下乙個值』。但是問題就在於整型在Ruby裡面並不是乙個物件,而是乙個立即值。

也就是說 i 的值是直接存在這個變數裡面而不是先建立乙個整型物件然後用 i 指向它(這樣應該是出於效能考慮)。這樣就無法用訊息傳送的模型來處理 i++ 這個動作了,所有和這類整型有關的讀寫操作都是另外實現的。

所以如果要加上 i++ 特性的話,要麼把整數物件化,但是這樣並沒有太大的意義,而且效能還可能會下降。要麼再給整數特地加上這個功能,但是這樣其他型別是不是也要加上++操作符呢(而且實現模型還不一樣,這是需要訊息傳送的)?但是大多數型別並不需要這個自增的語義(我能想到的就只有數字和迭代器可能會需要),為了這個特性修改語法解析規則帶來的收益太小,沒有意義。

況且和Python一樣,Ruby的數字是immutable的,i++這樣修改變數值的動作本來就是做不到的。

3樓:冒泡

以py為例

如果要實現也很容易,不過需要注意,跟賦值一樣,在py中自增自減得是乙個語句,而並不能成為其他表示式的一部分,能連續賦值是因為py有特殊支援這種語法,就像樓上乙個答案說的,a=b=c不代表a=(b=c)

另外有些答案說,py中a+=b相當於a=a+b,其實這也是不對的,比如list的+=相當於extend,而list的+是生成了新物件,python實際上是這樣實現的:

a=a+b <===> a=a.__add__(b)

a+=b <===> a=a.__iadd__(b)

可以看到是不同的運算子內建方法,完全可以實現為不一樣的邏輯(比如整數的__iadd__就直接呼叫__add__,所以等價,而list的則實現不同,且__iadd__裡面return的是self,於是就跟extend一樣了,只是多一次多餘的賦值,因為這個賦值是為了保證實現模型一致)

所以自增自減其實很容易實現:

++a <===> a=a.__inc__()

--a <===> a=a.__dec__()

__inc__和__dec__跟上面說的一樣,return self即可,當然也可以不return self,這樣自由度更大,比如乙個變數a在自增過程中出現一些情況,結果變成None了都可以

因為作為語句,所以前++還是後++沒啥區別,當然py沒有提供這倆,可能是作者不喜歡,也可能是其他原因,總之理論上如果有了上面的限定,實現這倆本身沒啥難度

4樓:

個人感覺應該是自增運算子沒有意義吧。因為Python裡int型別的值其實是不可改變的,賦值只是將引用賦給了另乙個物件。

#python 3a=

2333

print('

{}@{}'

.format(a

,id(a

)))a+=1

print('

{}@{}'

.format(a

,id(a

)))可以看出雖然變數名仍然叫a,但在記憶體的位址卻已經改變了。物件都不是原來的物件了,何來自增之說?

相對的,在C++中//C++ 11

inta

=2333

;std

::cout

<

<

endl;++

a;std::

cout

<

<

endl;a

+=1;std

::cout

<

<

endl

;a的位址是不會變的,程式將新值仍放在原來的位址中。不過,自增自減運算子也不是只能用於數值運算,C++中STL的iterator也可以用++/--,還是挺方便的,在引入Ranged for statement之前都要依賴這種方法來遍歷容器。

初學python,一點淺見還請指教!

5樓:BariaGrr

好多人說是因為物件什麼的…

但i++可以當作i+=1的語法糖不是嗎…

主要是因為Python和Ruby下有超好用的迭代器導致自增沒那麼常用了吧…

順便知乎新版客戶端發個回答卡五次還差點給我全刪了……

6樓:Henry Zhao

>>> b = 5

>>> a = 5

>>> id(a)

162334512

>>> id(b)

162334512

>>> a is b

True

「可以看出, python 中,變數是以內容為基準而不是像 c 中以變數名為基準,所以只要你的數字內容是5,不管你起什麼名字,這個變數的 ID 是相同的,同時也就說明了 python 中乙個變數可以以多個名稱訪問」

-------上面這句並不正確。感謝 @la.onger指教,如他所說:

int理論上是每次賦值都建立乙個新物件的。但是由於使用頻繁,為了提公升效能避免浪費,所有python有個整數池,預設1~256的數字都屬於這個整數池,這些每次賦值的時候,是取得池中的整數物件。但是其他的除外,如:

>>> a = 257

>>> b = 257

>>> id(a)

140397570652784

>>> id(b)

140397570652736

「這樣的設計邏輯決定了 python 中數字型別的值是不可變的,因為如果如上例,a 和 b 都是 5,當你改變了 a 時,b 也會跟著變,這當然不是我們希望的」

-------這句也是錯誤的。改變a時,b並不會跟著改變,如 鄭程所說。如:

>>> a=5

>>> b=5

>>> a+=1

>>> a

>>> b

關於 python 的自增運算

為什麼法語 俄語 德語 西班牙語等語言可以直接拼讀,英語就要用音標?

c2002ncut 先來了解一下英語的歷史 為什麼英文發音拼寫規則雜亂?一起梳理這段英語史 總體來說,包括以下幾條 一 諾曼征服改變了英語的拼寫,還大量引進了法語詞彙。二 母音大推移 中拼寫沒有隨發音改變,而在此過程中還發生了其他一些變化。從14世紀到17世紀,英語發生了不明原因的 母音大推移 很多...

為什麼英語有音變現象,而德語 義大利語等字母語言就沒有類似的現象呢?

紙婷是英語老師 不奇怪啊,有母音有子音就會這樣啊,其他語不清楚不過西語說快了也會語流音變啊,比如委內瑞拉那邊的西語好多音都被帶過去了。其實音變說白了就是大家說話說累了肌肉放鬆了想省省事 俄語裡的 在非重讀情況下讀作 而 本身也發生了音變 同情況下讀作 i g 則是把之前兩個子音 g 和 h 合二為一...

腓尼基語 烏加裡特語等古代閃族語言的母音是如何推測出來的?

Olympiodorus 談一談個人觀點,不一定準確,僅供參考。由於我對烏加裡特語的了解實在太少,就不發表意見了,這裡只提腓尼基語。1.根據同為迦南諸語的希伯來語進行推測。由於有Niqqud拼音標記的緣故,古典希伯來語的母音儲存得較為完好。希伯來語和腓尼基語均受到了迦南音移 Canaanite Sh...