Назначение Tuple в Python, это ошибка в Python?

Я читал это интересное сообщение https://asmeurer.github.io/blog/posts/tuples/

В примечании автора представлен этот пример

>>> t=1,2,[3,4] >>> t (1, 2, [3, 4]) >>> t[2]+=[5,6] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment 

Хотя Python создал исключение, но он изменил кортеж

 >>> t (1, 2, [3, 4, 5, 6]) 

Не уверен, что здесь происходит, это ошибка?

Поведение такое же в 2.7.10 и 3.5.1

3 Solutions collect form web for “Назначение Tuple в Python, это ошибка в Python?”

Поэтому поведение += немного странно. Для неизменяемых объектов, таких как целые, он должен назначить новый объект с тем же именем:

 a = 4 a += 3 

Для изменяемых типов, например списков, объект изменяется на месте, но также возвращает тот же объект, который должен быть назначен с тем же именем. Первый шаг работает с вашим кортежем, но не вторым.

Вот почему после того, как список расширен, исключение возникает.

Это связано с тем, что оператор += (который __iadd__ или внутреннее добавление внутри) фактически возвращает что-то после выполнения задания. В list это переводится в вызов extend (или что-то в этом роде), и, таким образом, новые элементы уже вошли, прежде чем ссылка на список была возвращена для присвоения t[2] , что затем вызывает исключение. Теперь вы проверяете значение, которое вы можете видеть, добавив его. Ниже приведен минимальный код, демонстрирующий это:

 >>> class AddIDemo(object): ... def __init__(self, items): ... self.items = list(items) ... def __iadd__(self, other): ... print('extending other %r' % other) ... self.items.extend(other.items) ... print('returning self to complete +=') ... return self ... def __repr__(self): ... return self.items.__repr__() ... >>> demo = AddIDemo([1, 2]) >>> demo += AddIDemo([3, 4]) extending other [3, 4] returning self to complete += >>> demo [1, 2, 3, 4] >>> t = 1, 2, demo >>> t (1, 2, [1, 2, 3, 4]) >>> >>> t[2] += AddIDemo([5, 6]) extending other [5, 6] returning self to complete += Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment >>> t (1, 2, [1, 2, 3, 4, 5, 6]) >>> 

Обратите внимание, что я добавил еще несколько операторов печати, чтобы показать, что вызываемая функция и как выполнялась операция, как это было бы при стандартной обработке list с помощью += или __iadd__ .

Это не ошибка, но состояние, в котором вы останетесь, когда возникнет исключение, может ввести в заблуждение.

Кортеж по дизайну не должен изменяться, но он применяется только к кортежу, а не к его элементам. Если он содержит изменяемый элемент, этот элемент может быть изменен. В вашем случае список – это такой элемент, который можно изменить.

Теперь оператор += более или менее сопоставляет команду a + а затем присваивает ее исходной переменной. Операция + возможна, вы можете добавить два списка. Для причины opimization + реализуется как extend() и обновления на месте. Но назначение не выполняется, поскольку элемент кортежа не может быть случайным.

В основном есть два урока:

  1. Операторы Python могут быть реализованы по типу и могут вести себя иначе, чем тривиальные ожидания.
  2. Если исключение возникает при вызове функции и не обрабатывается должным образом, оно могло бы сделать что-то, перед чем не очищается.
  • Webdriver не может пройти, нажав кнопку следующей страницы
  • Как я могу представить «Enum» в Python?
  • Как читать и редактировать электронные таблицы Google с помощью Python 3.x?
  • Импортируйте txt-файл и имея каждую строку в виде списка
  • Разница между менеджерами геометрии «сетка» и «пакет»
  • Обработка строки Python 3.3 C (wchar_t vs char)
  • Поиск замены шаблонов с использованием лямбда
  • Python горит звездочкой в ​​аргументе функции
  • Python - лучший язык программирования в мире.