Назначение 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. Если исключение возникает при вызове функции и не обрабатывается должным образом, оно могло бы сделать что-то, перед чем не очищается.
  • Не удалось получить фактическую разметку со страницы с помощью BeautifulSoup
  • В Python argparse, возможно ли иметь парные --no-something / - что-то аргументы?
  • Установка OpenCV 3 для Python 3 на Mac с использованием Homebrew и pyenv
  • Как установить PyGObject с поддержкой Python 3
  • Интерфейсы веб-шлюза в Python 3
  • NameError: имя 'reload' не определено
  • Оператор Python 3 >> для печати в файл
  • Как изменить строковое представление класса Python?
  • Как принимать входные данные как для типов int, так и для float?
  • supervisord для python 3?
  • Изменение переменной в импортированном модуле из ... import *
  •  
    Interesting Posts for Van-Lav

    Возвратите наиболее распространенные слова на веб-сайте, так что число слов> 5

    sublime – сохранить все открытые / загруженные файлы с именами?

    Как динамически нажать кнопку загрузки с помощью selenium python?

    AttributeError: ниже не найден; используя Pipeline с CountVectorizer в scikit-learn

    Как отображать только левую и нижнюю границу рамки в matplotlib?

    Двоичная классификация в TensorFlow, неожиданные большие значения потери и точности

    Как я могу явно освободить память в Python?

    Как установить модуль win32com в virtualenv?

    AWS EMR Spark «Нет модуля под названием pyspark»

    список движков блога, написанных на python

    Функциональное программирование – для циклов while и while

    Пользовательская аутентификация (модель пользователя) для облачных конечных точек – Python

    Можно ли удалить набор точек останова с помощью ipdb.set_trace ()?

    Как работает декоратор @timeout (timelimit)?

    Как добавить контент в PDF с помощью PyPDF2 и сохранить предыдущие версии

    Python - лучший язык программирования в мире.