2013-01-11 45 views
2

我簡直不敢相信,但它有可能在Python代碼混合製表符和空格:爲什麼可以混合蟒蛇壓痕

if __name__ == '__main__': 
    for a in range(3): # indented with 4 spaces 
     print(a)  # indented with 4 spaces and one tab 

這背後的原因是什麼?

測試上:

  • 的Python 3.3.0(CPython的)
  • 的Python 2.7.3(CPython的)

注:看來,計算器改變標籤用空格!

+1

如果你不喜歡它,使用'-tt'命令行開關。 http://docs.python.org/2/using/cmdline.html#cmdoption-t –

+0

-tt似乎不適合我:/ – aisbaa

+0

它只能防止空格和製表符的不一致使用,而不是所有的混合使用。 –

回答

7

這是關於Python縮進的很多神話之一。

Python的實際作用是查看行之間的相對縮進量,而不是固定量。

  • 當行之間的縮進增加時,它認爲它是塊的開始,並將新的縮進級別壓入堆棧。
  • 當縮進減小,它彈出縮進級別堆棧,直到找到一個匹配的水平,關閉塊爲每個彈出

它不關心是否要使用製表符,空格,或它們的混合物,如只要您在區域範圍內的每個層級都保持一致。

E.g.下面是一個有效的文件(用[]表示一個空格,而[T]代表一個標籤)

if True: 
[ ][ ][ ][ ]print ("Four spaces") 

if True: 
[t]print ("Tab") 
[t]if True: 
[t][ ][ ][ ]print ("Tab and three spaces") 

if True: 
[ ][t][ ]print ("Mixture") 

說了這麼多 - 最有理智的人堅持到4位爲標準縮進,方式Benevolent Dictator intended it

請參閱Python: Myths about Indentation瞭解更多信息。

2

縮進是在Python中引入的,以確保每個書寫的代碼都有縮進,以便其他編碼人員可以正確讀取它。

這並不意味着,編碼人員有他的自由。只要每個塊保持縮進,不同的塊可以有不同的縮進。

例如,你可以有一個這樣的工作文件,但不推薦。

print "hello" 
if True: 
[TAB]print "a" 
[TAB]i = 0 
[TAB]if i == 0: 
[TAB][SPACE][SPACE]print "b" 
[TAB][SPACE][SPACE]j = i + 1 
[TAB][SPACE][SPACE]if j == 1: 
[TAB][SPACE][SPACE][TAB][TAB]print "c 

更多閱讀... http://docs.python.org/release/2.5.1/ref/indentation.html