參考文章來自:https://docs.python.org/2.0/ref/indentation.html 分享一波html
前言python
Python中的縮進(Indentation)決定了代碼的做用域範圍。這一點和傳統的c/c++有很大的不一樣(傳統的c/c++使用花括號{}符,python使用縮進空格)。c++
每行代碼中開頭的空格數(whitespace)用於計算該行代碼的縮進級別(Indentation level),注意一個Tab等於8個空格(Space),縮進級別爲0表示無縮進空格。數據結構
Python中的每一條語句都有一個縮進級別,而且縮進級別會使用棧的數據結構進行存儲。在開始讀取文件以前,0(表示縮進級別爲0,無縮進)會被首先壓入棧中。而後從文件開頭到末尾,依次讀取每行邏輯代碼,每行邏輯代碼的縮進級別都會和棧頂值進行比較,若是相等,那麼什麼都不會發生;若是比棧頂值大的話,那麼該行邏輯代碼的縮進級別就會被壓入棧中,同時會生成一個縮進標記(INDENT LEVEL);若是比棧頂值小的話,那麼棧中全部比該行邏輯代碼縮進級別大的值都會從棧中移除,而且還會生成一個擴展標記(DEDENT LEVEL)。學習
下面是一個正確的縮進案例:spa
學習歷來不是一我的的事情,要有個相互監督的夥伴,工做須要學習python或者有興趣學習python的夥伴能夠私信回覆小編「學習」 獲取資料,一塊兒學習htm
上面的#0行,縮進0個字符,因爲文件讀取以前0已經被壓入棧中了,因此棧中的數據不會發生改變。#1縮進4個字符,4被壓入棧中。#2縮進18個字符,18被壓入棧中。#3縮進4個字符,18被彈出棧,棧頂值又爲4了。#4和#3縮進同樣,因此不更新棧數據。#5縮進13個字符,因此13被壓入棧中。#五、#6和#7的縮進同樣,不更新棧數據。#8縮進14個字符,14被壓入棧中。#9的縮進4個字符,因此棧中的13和14都會彈出,棧頂值又恢復爲4。作用域
下面是一個錯誤的案例:get
#一、#2和#3處的錯誤解釋的很清楚了。#5的縮進級別在棧中找不到因此出錯,#5處的縮進級別是14,比它的上面一行縮進級別18,因此在#5處應該進行出棧處理,可是在棧中找不到14這個級別,因此出錯。it
又好比:
最後一行代碼的縮進級別是1,並且比上一行代碼的縮進級別小,因此應該出棧處理,可是在出站的時候找不到棧中之前有1的級別,因此報錯。
要修改的話,只須要將最後一行的空格去掉就能夠。