파이썬으로 잘못된 수학?


78

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

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

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

>>> 2013*013
22143

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

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



6
실제로 알아 차리면 +1. 8 진수라는 건 알았지 만 몰랐 으면 2013 * 13이 22143이라고 생각했을 것입니다. 잘못된 답이라는 것을 어떻게 알았습니까?
11684

11
고등학교 때 잠시 정신 수학을했는데 22143이 생각보다 약간 작다고 생각했습니다. 그래서 믿을 수있는 계산기로 확인했습니다.
James Elegan 2013-04-09

2
당신의 좋은 ole 'noggin을 신뢰하면 +1.
Sean Allred 2013

13
@ 11684 두 숫자의 마지막 숫자가 3 인 경우 제품의 마지막 숫자는 9 여야합니다. 초등학교 수학 ...
Aleksandar

답변:


137

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'을 의미하기 때문에 실수로 잘못된 값을 가진 정수 객체를 만드는 것은 매우 쉽습니다. 이는 대부분의 인간이이 리터럴에 할당하는 의미가 아닙니다 .


14
@JamesElegan : 아마도 그것이 파이썬 3이 0123구문을 불법으로 만들고 항상 0o123.
Tim Pietzcker 2013

3
예, 00-8 앞에 오는 접두사는 8 진수입니다. 0x0-9a-f 앞에 오는 접두사는 16 진수입니다.
Frambot 2013-04-09

97
프로그래머가 항상 할로윈과 크리스마스를 혼동하는 이유는 무엇입니까? DEC25 == OCT31이기 때문에! Nyuk nyuk nyuk.
Frambot 2013-04-09

16
@JoeFrambach, 0접두사 0 - 다음 7 진수입니다 :)
마크 Tolonen

5
자비로운 독재자는 첫 라운드에서 Lisp에서 제대로 복사하지 않았습니다. 이러한 것들은 크고 명확해야합니다 : #xFF, # o777, # b1011.
Kaz

36

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 

답변 해주셔서 감사합니다! 나는이 진수 것은 혼란 조금 생각하지만 적어도 지금은 : 그것에 대해 알
제임스 Elegan

3
당신은 매우 환영합니다. 저와 @wim의 답변에서 언급했듯이 Python 커뮤니티는 Python 3에서 8 진수 리터럴에 대한 초보자 혼동을 최소화하기 위해 할 수있는 일을하고 있습니다. 그래도 알아 두어야 할 것은 매우 좋은 것입니다. Python 2.X 또는 다른 언어에서 0 접두사가 붙은 8 진수 리터럴.
DARSHAN Rivka 깍는

2
PEP 3127은이 점에서 약간 재미 있습니다 ... 예를 들어, "새로운 Python 사용자는 (현재) 그의 숫자가 제대로 작동하지 않는다는 지연된 발견에 대해 미스터리 할 수 ​​있습니다. 우리는 Python을 즉시 설명하여 수정할 수 있습니다. 앞에 오는 0을 좋아하지 않습니다 (합리적인 메시지와 함께!). 아니면이 교육 경험을 Internet Explorer 브라우저의 JavaScript 인터프리터에게 위임하고 문제를 디버깅하도록 할 수 있습니다. "
2013


5

이것은 대부분 @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"접두사를 붙입니다.


파이썬은 내가 정말 큰 숫자를 입력 할 때 자동으로 L을 추가하는 것 같습니다 (예 : 9999999999999999999999999, 3333333333과는 같지 않음). 직접 추가해야하는 시간이 있습니까?
James Elegan 2013-04-09

@JamesElegan은 매우 오래된 Python 버전을 사용하는 경우에만 가능합니다. 그리고 파이썬 3에서는 int와 long 유형 사이의 다른 모든 차이점과 마찬가지로 L이 완전히 사라졌습니다.
LVC

Python 2.7은 너무 오래되지 않았습니다. 나는 L.를 추가 할 필요가 없습니다 그래서 (내가 파이썬 3에 대한 좋은 물건을 계속 듣게, 어쩌면 난 그냥 설치하고 사용해야합니까?)
제임스 Elegan

나는 이전 버전이 맞지 수있는 것보다 더 큰했다 리터럴의 접미사를 요구하는 어떤 정확한 정보를 찾을 수없는 @JamesElegan int(그리고 사실 하나를 거기에 대해 잘못 될 수도 있습니다) - 내 자신의 메모리가 상당히있는 것으로까지 거슬러 올라갑니다 2.4가 필요하지 않았는지 확인하십시오. 그러나 예, 아직 포팅되지 않은 라이브러리에 의존하지 않는 경우 Python 3은 일반적으로 이동할 가치가 있습니다.
LVC

Python 2.7은 Python 2의 최신 버전입니다. 실제로 이번 주말에 2.7.4가 출시되었습니다. Python 3은 Python 2와 상당히 다르지만 궁극적으로 대부분의 Python 코드는 멀지 않은 미래에 또는 적어도 목표 인 것처럼 보이는 Python 3 코드로 작성 될 것입니다. 당신이 막 시작하고 당신이 배울 수있는 하나를 선택할 수 있습니다 그렇다면, 나도 3 모두 2, 3 권 해드립니다
카일 해변
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.