Может ли кто-нибудь, знакомый с внутренними компонентами Python (CPython или другими реализациями), объяснить, почему добавление списка должно быть однородным:
In [1]: x = [1]
In [2]: x+"foo"
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
C:\Users\Marcin\<ipython-input-2-94cd84126ddc> in <module>()
----> 1 x+"foo"
TypeError: can only concatenate list (not "str") to list
In [3]: x+="foo"
In [4]: x
Out[4]: [1, 'f', 'o', 'o']
Почему не следует, чтобы x+"foo"
выше возвращал то же значение, что и конечное значение x
в приведенном выше расшифровке?
Этот вопрос следует из вопроса NPE здесь: Является ли поведение списка Python + = iterable документированным где угодно?
Обновление: я знаю, что не требуется, чтобы гетерогенный +=
работал (но это так), и также не требуется, чтобы гетерогенная +
была ошибкой. Этот вопрос связан с тем, почему этот последний выбор был сделан.
Слишком много говорить о том, что результаты добавления последовательности в список неопределенны. Если бы это было достаточным возражением, было бы целесообразно предотвратить гетерогенную +=
. Update2: В частности, python всегда делегирует вызовы оператора в lefthand operand, поэтому не возникает проблема "что делать правильно": левый объект всегда управляет (если он не делегирует справа).
Update3: для тех, кто утверждает, что это дизайнерское решение, объясните (а), почему он не документирован; или (b) там, где оно документировано.
Update4: "что должно [1] + (2, )
вернуться?" Он должен вернуть значение результата, равное значению переменной x
, первоначально удерживая [1]
сразу после x+=(2, )
. Этот результат хорошо определен.