Python不支援 i 語法的原因解析

2022-09-26 19:54:16 字數 2296 閱讀 8184

簡要討論為什麼它不提供++作為運算子

正常情況下,當有人問起++原因而不是python中的運算子時,這一行引起了我的注意。

如果您想知道最初的原因,則必須翻閱舊的python郵件列表,或詢問那裡的某個人(例如guido)〜通過stackoverflow

這迫使我像上圖一樣思考。 真的我必須問guido原因嗎? 好的,也許但是在那之前,我應該嘗試一下,這促使我寫這篇文章

在c / c ++ / j**a之類的語言中,對整數變數進行自增或自減運算是標準的,可以分為字首運算(++ i和–i)和字尾運算(i ++和i–), 每個都有細微的差異和不同的目的。

當這些語言的使用者進入python時,他們可能會想知道為什麼它不提供++或-操作。

儘管字首++ i可能出現在python中,但它不是" ++"自增運算子。

在這種情況下,它只是兩個" +"(正號)的疊加,而根本不支援" ++"字尾! (syntaxerror:語法無效)。

那麼,為什麼python不支援i ++增量語法?

首先,python當然可以實現自我增強的效果,即以i + = 1或i = i + 1的形式編寫,這在其他語言中也很常見。

儘管python在底部使用了不同的魔術方法(add ()和__iadd __())來完成計算,但是表面上的效果卻完全相同。

因此,我們的問題可以轉換為:為什麼以上兩種書寫風格會比i ++更好,並成為python的最終選擇?

1. python整數是不可變的型別

當我們定義i = 1000時,不同的語言會區別對待它們。

諸如c(寫入int = 1000)的語言將適用於記憶體空間,並將其``繫結''到固定名稱i上,同時寫入變數值1000。

這裡,i的位址和型別是固定的,而值是可變的。

python(寫i = 1000)也將申請記憶體空間,但是它將"繫結"到數字1000,即該1000的位址和型別是不可變的

因此,當我們使我"自我增加"(i = i + 1)時,兩者都被區別對待。

諸如c之類的語言首先找到儲存在i位址中的值,然後將其加1。 操作後,新值將替換舊值 python的操作過程是將i指向的數字加1,然後,將結果繫結到新應程式設計客棧用的儲存空間,然後將名稱標籤"貼上"到新數字。

打個比方:c中的i就像是乙個寄生了1000的主機,而python中的1000就像了乙個寄生了i的主機。 所以我在c語言中與python中的1000相同

綜上所述,讓我們看一下i ++,不難發現:

在c之類的語言中,i ++可以表示i的數值屬性的增加,既不會開啟新的記憶體空間,也不會建立新的一等公民 在像python這樣的程式設計客棧語言中,如果i ++是對其name屬性的操作,則這沒有任何意義。 如果將其理解為對數字本體的一種操作,那麼情況將會很複雜。

它將生成乙個新的一等公民1001,因此需要為其分配乙個記憶體位址。 如果此時占用的位址為1000,則將涉及舊物件的**,並且與1000的原始引用關係也將受到影響。 因此只能為1001開啟新的記憶體空間

如果python支援i ++,則其操作過程將比c ++複雜,並且其含義不再是"將數字增加1"(遞增),而應是"建立新數字"。

python理論上可以實現i ++操作,但是它必須重新定義"增量運算子",這將導致具有其他語言經驗的人誤解。

最好讓每個人都直接寫i + = 1或i = i + 1。

2. python具有可迭代的物件

諸如c / c ++之類的語言已將i ++設計為主要是為了方便使用三部分的for迴圈結構。

這種程式與數字本身的自增過程有關。 數字的增加與程式主體的執行有關。

python中沒有這種結構,它提供了一種更優雅的方法:

這裡反映了不同的思維方式。

python中的可迭代物件/迭代器/生成器提供了很好的迭代/遍歷用法,並且可以完全替代i ++。

例如,python可以使用enumerate()與上述示例中的值同時遍歷下標和特定值。

再舉乙個例子,對於字典遍歷,python提供了keys(),values(),item()和其他遍歷方法,這些方法非常易於使用:

不僅在python中很少使用i + = 1或i = i + 1,而且迭代物件的可用性使操作值範圍變得容易,並且很少有人要求對其進行累加。

因此,回到我們最初的問題,這兩種"自增"方法並不比i ++好多少,僅僅是因為它們是通用操作

這就是為什麼無需引入新的運算子,python會繼續提供基礎支援的原因。 真正的贏家是各種各樣的可迭代物件!

摘要python不支援遞增運算子,原因如下:

因為它的整數是一www.cppcns.com類不變的一等公民,所以如果要支援增量運算(++),將會帶來歧義

含糊不清的原因:在本故事中

主要是因為它具有更合適的實現,即迭代物件,它對遍歷操作具有良好的支援。

mysql不支援 MySQL不支援的特性

mysql 1 不支援物化檢視。2 不支援位圖索引。3 不支援並行查詢。4 不支援雜湊關聯,mysql的所有關聯都是巢狀迴圈關聯。不過,可以通過建立乙個雜湊索引來曲線實現。5 不允許對同一表同時進行查詢和更新。報錯 update tb1 as outer tb1 set cnt select cou...

IE不支援使用for in語法

在專案發現遍歷checkbox獲取選中值時出現ie不支援for in語法問題 var checklist var checkname document.getelementsbyname ischeck ie無法正常使用,chrome和firefox等主流瀏覽器正常 for i in checkna...

SQLite不支援的SQL語法總結

1 top 這是乙個大家經常問到的問題,例如在sqlserver中可以使用如下語句來取得記錄集中的前十條記錄 select top 10 from index order by indexid desc 但是這條sql語句在sqlite中是無法執行的,應該改為 select from index o...