2012-02-01 41 views
4

我們不能宣佈與0瞭解Python的命理

>>> n = 08 
SyntaxError: invalid token 

啓動一個整數但是我們聲明,包含所有零的變量。

>>> n = 00000 
>>> print n 
>>> 0 

所以,問題是在第一種情況下,爲什麼蟒蛇只是沒有忽略對左側的零,而不是拋出異常考慮變量的值n = 8。在第二種情況下,它仍將全零視爲有效值。

考慮另一種情況。

>>> n = '0008' 
>>> print int(n) 
>>> 8 

現在在第三種情況下,它仍然認爲它是一個有效的數值,爲什麼這裏不會引發異常?

+0

在這裏工作很好。 – 2012-02-01 03:19:42

+0

有趣的是,Python 2.7.1允許'n = 01',但是Python 3.2會拋出'SyntaxError'。 – sarnold 2012-02-01 03:20:42

+0

我在使用python shell的windows命令行中聲明瞭變量,並在那裏引發錯誤,而在.py文件中編寫此代碼不會產生異常。奇怪的是,我用shell的輸出更新了我的問題。 – 2012-02-01 03:27:18

回答

9

以0開頭且不包含小數點的數字是解釋爲八進制(使用數字0-7)。 08不是有效的八進制數。根據PEP索引,「通過使用前導零指定八進制數的能力將從Python 3.0中的語言(以及2.6的Python 3.0預覽模式)中移除,並且每當前導」 0「緊接着是另一個數字」可以在這裏找到http://www.python.org/dev/peps/pep-3127/

+0

爲什麼int('0008')不會引發異常? – 2012-02-01 03:32:35

+0

出於同樣的原因'int('010')'給出'10'。 'eval('08')'會給你一個例外。 – wim 2012-02-01 03:39:19

+0

它與數字系統有關。有二進制,十六進制,八進制等。看看數字表示http://acad88.sahs.uth.tmc.edu/research/publications/Number-Representation.pdf – 2012-02-01 03:49:03

0

我這個沒有問題:

#!/usr/bin/python 

def test2(): 
    n = 01 
    print n 

test2() 

但對於這一點,輸出64(基數8):

def test2(): 
    n = 0100 
    print n 

test2() 

Python 2.6.6

4

在大多數語言中,0前綴表示八(基數8)。

在Python 2.7版,我得到:

>>> n = 010 
>>> n 
8 

我想你的問題是在其他地方。 (不過,如果這是一個版本問題,我想他們認爲幾乎沒有人想要以8爲基礎對變量進行硬編碼,所以他們認爲它是一個錯誤)。

- 編輯:

事實上,八進制格式已經改變(3.0):

http://docs.python.org/release/3.0.1/whatsnew/3.0.html#new-syntax

現在是:

>>> n = 0o10 
>>> n 
8 

(在2.6+工程)

+2

就是這樣。 Python認爲它是八進制的。 – senderle 2012-02-01 03:24:32

+0

那麼爲什麼int('0008')不會引發異常? – 2012-02-01 03:34:46

+0

@AamirAdnan那麼,你可能會安全地假設大多數時候,當你試圖轉換整數時,你更願意讓它們以10爲底。所以默認行爲就是這樣做。大多數語言都有一種解析字符串的方法,就好像它在某個基礎中一樣。但它可能只是默認以10爲底。例如,考慮:int('010',8)'。 – 2012-02-01 03:40:48

3

關於錯誤發生的原因的問題已被其他人回答;在Python中有一個數字文字的約定,因此以0開頭的文字被認爲是八進制。如果你在這樣的文字中輸入一個大於7的數字,結果是錯誤的。然後,在Python 3中,該慣例發生了變化,並且在它們開頭的所有文字爲0都會導致引發錯誤。

第二個問題是爲什麼int不會拋出該錯誤。 int不會拋出該錯誤,因爲它有自己的約定來指定一個字符串的基礎:一個可選的第二個參數,默認值爲10.這允許int接受更寬範圍的值,而不用擔心模糊性。考慮到這一點,例如:

>>> int('55', 16) 
85 
>>> int('0x55', 16) 
85 

這裏的基地是指定的;沒有歧義。在這種情況下,在開始時用傳統的0x拒絕字符串將是一個障礙。同樣地,當基數明確時,拒絕開始時使用0的字符串將是不合理的。10

通常,對於語言來說,對文字要嚴格但對類型更靈活轉換。

+0

@阿米爾阿德南,我意識到你的問題有第二部分 - 見上文。 – senderle 2012-02-01 03:58:16