2014-12-24 6 views
0

, 우리는 할 수 있습니다파이썬에서 문자열을 숫자로 곱할 수는 있지만 문자열과 숫자를 추가 할 수없는 이유는 무엇입니까? 파이썬에서

'a' * 4 

가 'AAAA'를 얻을 수 있습니다.

우리는 할 수 없습니다

'a' + 4 

우리는 먼저 문자열로 (4)를 캐스팅해야합니다.

String 및 Int arg에 대한 정의를 *로 오버로드하고 String 및 Int에 대해 + 오버로드하지 않으려면이 임의의 선택입니까?

필자는 위 예제에서 4를 문자열로 변환하지 않는 것처럼 암시 적 유형 변환을 수행하지 않는 언어로 정의하면 '강하게 입력 된'것으로 간주되는 파이썬에 어떻게 들어 맞는지 이해하려고합니다. 따라서 첫 번째 예에서는 연산자 오버로딩의 예이며 암시 적 변환이 아닙니다.

문서에서 나는 Int와 String을 취하는 mul이나 *의 정의를 찾을 수 없으며 2 개의 Ints를 취하는 양식 만 찾을 수 있습니다. 과부하 된 정의가 무엇인지 어떻게 알 수 있습니까?

참조

: https://docs.python.org/2/library/operator.html

+6

'int * str'은 라이브러리 참조가 아니라 언어 참조 문서에있는 [here] (https://docs.python.org/2/reference/expressions.html#binary-arithmetic-operations) 문서입니다. (이 작업은 int와 시퀀스로 정의되며 문자열은 일종의 시퀀스입니다.) – jwodder

+1

[라이브러리 문서의 시퀀스에 대한 자세한 내용] (https://docs.python.org/2/library) /stdtypes.html#typesseq)에 작업 목록이 있습니다. –

+1

다른 질문에 대답하려면 입력 정의보다 오버로드와 관련이 있습니다. '+'연산자는 일부 시퀀스 (예 : 문자열)가 연결을 의미하거나 목록이 추가되도록 오버로드됩니다. –

답변

12

과부하이 단지 임의의 선택 *은 문자열과 지능의 인수에 대한 정의를하고, 문자열 및 인터넷 용 + 과부하하지?

본질적으로 그렇습니다. 그러나, 당신이 이야기하고있는 두 가지 작업이 실제로는 병렬이 아니라는 점은 주목할 가치가 있습니다. 'a' * 4에서는 두 부분이 다르게 사용됩니다. 문자열은 문자열로 사용되고 숫자는 숫자로 사용됩니다. 여기서 유형 변환이 일어나지 않습니다. 또한 'a' * 44 * 'a'과 동일합니다. 두 피연산자의 유형이 역할을 명확하게하기 때문에 순서는 중요하지 않습니다.

'a' + 4'a4'으로 바뀌면 다른 종류의 작업이됩니다. 이것은 암시 적으로 하나의 유형을 다른 유형 (여기서는 암시 적으로 int를 문자열로 변환)과 같이 작동하게합니다. 이것은 혼란을 가져올 수 있습니다. 예를 들어, '1' + 2을 수행하는 경우 12 또는 '12' 문자열을 가져야합니까? 1 + '2'을 수행하면 어떨까요? 1 + '2'1 + 'blah'과 다르게 동작해야합니까? 더 이상 결정을 내리기 위해 객체 유형에 의존하지 않으면 다른 방법을 결정해야하며 다른 방법은 분명하거나 일관성이 없습니다. "항상 첫 번째 인수의 유형으로 변환"또는 "항상 문자열로 변환"과 같은 임의의 선택을해야합니다.

그런 웜 깡통을 열지 않고, 일반적으로 파이썬은 암시 적 타입 변환을하기 위해 연산자 오버로딩을 사용하지 않습니다. 문자열 곱셈과 같이 여러 유형에서 연산을 수행 할 수있는 경우 각 유형을 그대로 사용하고 다른 형식으로 변환하지 않도록 동작을 구체적으로 정의합니다.