Почему конкатенация и повторение допускаются в кортежах? Поскольку Tuples неизменяемы, его нельзя изменять ни в какой точке [дубликат]

data$anim <- sapply(0, paste0,data$anim)
6
задан ducin 25 September 2013 в 22:44
поделиться

3 ответа

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 говорит то же самое.

24
ответ дан Veedrac 19 August 2018 в 01:49
поделиться
  • 1
    ok, поэтому я не могу добавить элемент в существующий кортеж (что делает его действительно неизменным), но новый объект создается на основе двух других объектов - это правильно? – ducin 25 September 2013 в 22:48
  • 2
    Это точно. – Veedrac 25 September 2013 в 22:49
  • 3
    В ваших фрагментах все еще не ясно. tuple :: += использует два кортежа для создания третьего, кортежа результата. Похоже, это отличается от списка :: += - потому что было бы логично, если бы он сделал то же самое (и создал третий список). Но lst + [4,5] фактически добавляет дважды. Почему list::+= не следует tuple::+=? – ducin 25 September 2013 в 22:53
  • 4
    Потому что list 's += находится на месте. «Более того», почему tuple не делает то, что list делает », и ответ заключается в том, что« он не может ». – Veedrac 25 September 2013 в 22:54
  • 5
    Я думал, что оператор += работает одинаково для каждого типа последовательности. Или, по крайней мере, для кортежей и списков. Спасибо, что объяснили, что это совершенно другое :). – ducin 25 September 2013 в 22:57

Изменяет ли += объект на месте или нет до объекта. С кортежем вы не изменяете объект, так как вы можете увидеть, создаете ли вы другую переменную, указывающую на тот же объект:

>>> x = (1, 2)
>>> y = x
>>> x += (3, 4)
>>> y
(1, 2)

С изменяемыми объектами, такими как списки, вы увидите, что значение изменения, отображаемые под всеми его именами:

>>> x = [1, 2]
>>> y = x
>>> x += [3, 4]
>>> y
[1, 2, 3, 4]
4
ответ дан BrenBarn 19 August 2018 в 01:49
поделиться
  • 1
    исходя из вашего ответа, поведение оператора += основано на изменяемой / неизменяемой вещи, а также на месте / не на месте. Благодарю. – ducin 25 September 2013 в 22:56
  • 2
    @tkoomzaaskz: На самом деле поведение += зависит от каждого типа. Если тип определяет метод __iadd__, Python будет его называть; в противном случае он будет вызывать __add__ (тот же метод, используемый для +). Большинство неизменяемых типов не определяют __iadd__, поэтому a += b совпадает с a = a + b; большинство изменяемых типов do определяют __iadd__, поэтому он мутирует их на месте. – abarnert 25 September 2013 в 23:24

вы не изменяете его, вы создали новый кортеж и изменили содержимое переменной a

try a[0] = a[0] + 1, чтобы увидеть неизменность

2
ответ дан prgao 19 August 2018 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: