2014-12-24 5 views
0

В Python, мы можем сделать:В Python, почему я могу умножить строку на число, но я не могу добавить строку и число?

'a' * 4 

, чтобы получить 'AAAA'.

Мы не можем сделать:

'a' + 4 

Мы должны сначала бросить 4 в строку.

Это просто произвольный выбор, чтобы перегрузить * с определением для String и Int arg и не перегружать + для String и Int?

Я пытаюсь понять, как это вписывается в Python, считающийся «сильно типизированным», если мы определяем это как язык, не выполняющий каких-либо неявных преобразований типов, например, как он не преобразует 4 в строку в приведенном выше примере. Итак, в первом примере это пример перегрузки оператора, а не неявное преобразование?

В документах я не могу найти определение mul или *, которое принимает Int и String, только форма, которая принимает 2 Ints. Как мы узнаем, какие перегруженные определения присутствуют?

Ссылка: https://docs.python.org/2/library/operator.html

+6

'int * str' документирован [здесь] (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

Является ли это просто произвольный выбор перегружать * с определением для строки и Int арг и не перегружать + для струнных и Int?

По существу, да. Однако стоит отметить, что две операции, о которых вы говорите, на самом деле не параллельны. В 'a' * 4 две части используются по-разному: строка используется как строка, а число - как число. Здесь нет конверсии типов. Также обратите внимание, что 'a' * 4 совпадает с 4 * 'a', потому что типы двух операндов делают их роли четкими, поэтому порядок не имеет значения.

Если (как вам кажется), он работал так, чтобы 'a' + 4 дал 'a4', это будет другой вид операции. Это было бы неявным образом сделать одно действие типа похожим на другой тип (здесь неявно преобразование int в строку). Это может привести к большой путанице. Например, если вы делаете '1' + 2, вы должны получить номер 12 или строку '12'? А если вы сделаете 1 + '2'? Должно ли 1 + '2' вести себя иначе, чем 1 + 'blah'? Если вы больше не полагаетесь на типы объектов, чтобы принять решение, вы должны решить какой-то другой способ, и ни один из этих способов не будет очевидным или последовательным. Вам снова придется сделать произвольный выбор, что-то вроде «всегда конвертировать в тип первого аргумента» или «всегда конвертировать в строку».

Вместо того чтобы открывать такую ​​банку червей, Python обычно избегает использования перегрузки операторов для выполнения неявного преобразования типов. В тех случаях, когда операции могут выполняться на разных типах, как и при умножении строк, поведение определяется специально, чтобы использовать каждый тип как то, что он есть, а не преобразовывать его в нечто другое.