5
также неизменен. Когда у вас есть неизменяемая структура данных, a += b
эквивалентно a = a + b
, поэтому создается новое число, кортеж или что-то другое.
При выполнении этого с изменяемыми структурами структура изменена .
Пример:
>>> tup = (1, 2, 3)
>>> id(tup)
140153476307856
>>> tup += (4, 5)
>>> id(tup)
140153479825840
Посмотрите, как изменился id
? Это означает, что это другой объект.
Теперь с list
, который изменен:
>>> lst = [1, 2, 3]
>>> id(lst)
140153476247704
>>> lst += [4, 5]
>>> id(lst)
140153476247704
id
говорит то же самое.
Изменяет ли +=
объект на месте или нет до объекта. С кортежем вы не изменяете объект, так как вы можете увидеть, создаете ли вы другую переменную, указывающую на тот же объект:
>>> x = (1, 2)
>>> y = x
>>> x += (3, 4)
>>> y
(1, 2)
С изменяемыми объектами, такими как списки, вы увидите, что значение изменения, отображаемые под всеми его именами:
>>> x = [1, 2]
>>> y = x
>>> x += [3, 4]
>>> y
[1, 2, 3, 4]
+=
основано на изменяемой / неизменяемой вещи, а также на месте / не на месте. Благодарю.
– ducin
25 September 2013 в 22:56
+=
зависит от каждого типа. Если тип определяет метод __iadd__
, Python будет его называть; в противном случае он будет вызывать __add__
(тот же метод, используемый для +
). Большинство неизменяемых типов не определяют __iadd__
, поэтому a += b
совпадает с a = a + b
; большинство изменяемых типов do i> определяют __iadd__
, поэтому он мутирует их на месте.
– abarnert
25 September 2013 в 23:24
вы не изменяете его, вы создали новый кортеж и изменили содержимое переменной a
try a[0] = a[0] + 1
, чтобы увидеть неизменность
+=
использует два кортежа для создания третьего, кортежа результата. Похоже, это отличается от списка ::+=
- потому что было бы логично, если бы он сделал то же самое (и создал третий список). Ноlst + [4,5]
фактически добавляет дважды. Почемуlist::+=
не следуетtuple::+=
? – ducin 25 September 2013 в 22:53list
's+=
находится на месте. «Более того», почемуtuple
не делает то, чтоlist
делает », и ответ заключается в том, что« он не может ». – Veedrac 25 September 2013 в 22:54+=
работает одинаково для каждого типа последовательности. Или, по крайней мере, для кортежей и списков. Спасибо, что объяснили, что это совершенно другое :). – ducin 25 September 2013 в 22:57