2012-10-22 38 views
16

tôi chỉ thực hiện các chương trình sau đây trên thông dịch viên python của tôi:Python không thể xử lý chuỗi số bắt đầu bằng 0. Tại sao?

>>> def mylife(x): 
...  if x>0: 
...    print(x) 
...  else: 
...    print(-x) 
... 
>>> mylife(01) 
File "<stdin>", line 1 
mylife(01) 
     ^
SyntaxError: invalid token 
>>> mylife(1) 
1 
>>> mylife(-1) 
1 
>>> mylife(0) 
0 

Bây giờ, tôi đã thấy this nhưng như liên kết nói, 0 cho bát phân không hoạt động nữa trong python (tức là không làm việc trong python3). Nhưng điều đó không có nghĩa là hành vi của các số bắt đầu bằng 0 phải được diễn giải đúng không? Hoặc trong cơ sở-2 hoặc đại diện cơ bản-10 bình thường? Vì nó không phải như vậy, tại sao python cư xử như thế? Đây có phải là vấn đề triển khai không? Hay nó là một vấn đề ngữ nghĩa?

Trả lời

25

Tôi đoán là vì 012 không còn là hằng số bát phân trong python3.x, nên chúng không cho phép cú pháp 012 tránh các lỗi tương thích ngược lạ. Hãy xem xét kịch bản python2.x của bạn mà sử dụng bát phân hằng đen:

a = 012 + 013 

Sau đó, bạn cổng nó để python 3 và nó vẫn hoạt động - Nó chỉ mang đến cho bạn a = 25 thay vì a = 21 như bạn mong đợi trước đó (thập phân). Hãy vui vẻ theo dõi lỗi đó.

+0

Yup. Có vẻ như một lời giải thích tốt, như quyết định thiết kế có thể. Có thể sau hai năm, khi hầu hết các công cụ đã được chuyển, sau đó, tôi nghĩ, tính năng này nên được cho phép một lần nữa. Cảm ơn! –

+12

Nhắc nhở "Tại sao các lập trình viên nhầm lẫn Giáng sinh và Halloween" - "Bởi vì tháng mười hai (25) là oct (31)"; P –

+0

@JonClements - Tôi chưa từng thấy điều đó trước đây - Khá thông minh - tôi cho rằng có lẽ đã được đề cập trong một trong các lớp CS mà tôi chưa bao giờ tham gia. – mgilson

10

Từ việc phát hành Python 3 lưu ý http://docs.python.org/3.0/whatsnew/3.0.html#integers

literals

Octal không còn có dạng 0720; sử dụng 0o720 để thay thế.

Các 'hàng đầu zero' cú pháp cho literals bát phân bằng Python 2.x là một Gotcha chung:

Python 2.7.3 
>>> 010 
8 

Trong Python 3.x đó là một lỗi cú pháp, như bạn đã phát hiện ra:

Python 3.3.0 
>>> 010 
    File "<stdin>", line 1 
    010 
    ^
SyntaxError: invalid token 

Bạn vẫn có thể chuyển đổi từ chuỗi với số không hàng đầu cùng hơn bao giờ hết:

>>> int("010") 
10 
Các vấn đề liên quan