[python] 파이썬으로 잘못된 수학?

파이썬으로 시작해서 이건 아마 제 실수 일 겁니다.하지만 …

나는 파이썬을 시험하고있다. 나는 그것을 계산기로 사용하는 것을 좋아하고 몇 가지 자습서를 천천히 진행하고 있습니다.

오늘 이상한 일이 생겼어요. 2013 * 2013을 알아보고 싶었지만 잘못 썼고 2013 * 013을 썼고 다음과 같이 썼습니다.

>>> 2013*013
22143

계산기로 확인했는데 22143이 정답이 아닙니다! 2013 * 13은 26169입니다.

왜 파이썬이 나에게 잘못된 답을 주나요? 내 오래된 Casio 계산기는이 작업을 수행하지 않습니다.



답변

8 진수 산술로 인해 013은 실제로 정수 11입니다.

>>> 013
11

앞에 0 013이 있으면 밑이 8이고 1 * 8 1 + 3 * 8 0 = 11 로 해석됩니다 .

참고 :이 동작은 python 3에서 변경되었습니다 . 다음은 PEP 3127 의 특히 적절한 인용문입니다.

정수의 기본 8 진수 표현은 C와 유사한 언어에 익숙하지 않은 사람들에게 조용히 혼란 스럽습니다. ‘013’은 Python 언어 자체에 ‘decimal 13’이 아닌 ‘decimal 11’을 의미하기 때문에 실수로 잘못된 값을 가진 정수 객체를 만드는 것은 매우 쉽습니다. 이는 대부분의 인간이이 리터럴에 할당하는 의미가 아닙니다 .


답변

01311선행 0으로 인해 8 진수 정수 리터럴 (10 진수 정수 리터럴과 동일 )입니다.

>>> 2013*013
22143
>>> 2013*11
22143
>>> 2013*13
26169

8 진 정수 리터럴은로 시작 0하고 16 진 정수 리터럴 은 0x. 경험 한 정확한 혼란으로 인해 Python 3는 SyntaxError를 발생시킵니다.

>>> 2013*013
  File "<stdin>", line 1
    2013*013
           ^
SyntaxError: invalid token

0o또는 0O대신 다음이 필요합니다 .

>>> 2013*0o13
22143
>>> 2013*0O13
22143


답변

8 진 리터럴에 대한 파이썬의 ‘선두 0’구문은 일반적인 문제입니다.

Python 2.7.3
>>> 010
8

구문은 Python 3.x http://docs.python.org/3.0/whatsnew/3.0.html#integers 에서 변경되었습니다.


답변

이것은 대부분 @Wim의 대답을 약간 확장하지만 Python은 특정 접두사를 사용하여 정수 리터럴의 기본을 나타냅니다. 접두사가 없으면 정수는 10 진수로 해석됩니다. “0x”를 사용하면 정수가 16 진 정수로 해석됩니다. 정식 문법에 익숙하지 않은 경우 이해하기가 다소 까다 롭지 만 전체 문법 사양은 여기에 있습니다. http://docs.python.org/2/reference/lexical_analysis.html#integers

테이블은 기본적으로 긴 값 (즉, 일반 int의 용량을 초과하는 값)을 원하면 숫자 뒤에 문자 “L”또는 “l”을 입력한다고 말합니다. 숫자를 10 진수로 해석하려면 숫자를 정상적으로 쓰십시오 (앞에 0없이). 8 진수로 해석하려면 “0”, “0o”또는 “0O”접두사를 붙이십시오. 16 진수로 표시하려면 “0x”로 시작하십시오. 바이너리를 원하면 “0b”또는 “0B”접두사를 붙입니다.


답변