2015-09-26 4 views
2

Один вопрос, который я столкнулся сегодня, что на самом деле испытание неизменности кортежей в Python:Являются ли кортежи действительно неизменными в Python?

  • Интервьюер: Являются ли кортежи неизменны в Python?

  • Me: Да

  • Интервьюер: Так что же print(t1) здесь напечатать?

    t1 = (4, 5) 
    t1 = t1 + (91, 10) 
    print(t1) 
    
  • Me: (4, 5, 91, 10)

  • Интервьюер: Как неизменность кортеж затем определить такое поведение?

  • Me: Это не имеет ничего общего с неизменностью, t1 ярлык со ссылкой на новый кортеж.

  • Интервьюер:

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

    Что будет дальше?

  • Me: TypeError поднимают

  • Интервьюер: Что будет значение t быть после этого?

  • Me: (1, 2, [3, 4]) или (1, 2, [3, 4, 5, 6]) может быть, не уверен

  • Интервьюер: Что заставило вас думать, значение изменится на (1, 2, [3, 4, 5, 6]) и что произойдет, если я пишу

    >>> t[2] = t[2] + [5, 6] 
    

    будет t2 все еще be (1, 2, [3, 4, 5, 6]) после этого работа?

+2

Да, кортежи неизменяемы, но они могут содержать ссылки на изменяемые объекты. – jonrsharpe

+4

Кортеж как контейнер является неизменным, это означает, что вы не можете удалить или добавить к нему предметы, но элементы, которые он содержит, могут быть изменены. Также читайте: [Почему 'a_tuple [i] + = ['item']' вызывает исключение, когда сложение работает?] (Https://docs.python.org/2/faq/programming.html#why-does -a-tuple-i-item-raise-the-exception-when-the-addition-works) –

ответ

2

Несмотря на то, что кортежи неизменны, объект внутри него может быть mutuable

Поскольку в >>> t = (1, 2, [3, 4]) список изменчив, так что вы можете изменить значение списка с дополненным заданием. +=, но затем возникает исключение.

здесь т [2] список модифицируется, как вы можете увидеть

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

Как вы можете видеть, что т [2] идентификатор никогда не будет изменен.

enter image description here

Что касается второго случая: t[2] = t[2] + [5,6] - она ​​создает новый список, а затем назначить его t[2]

>>> li = [1,2] 
>>> id(li) 
38036304 
>>> li = li + [3,4] 
>>> id(li) 
38074368 
>>> li += [5,6] 
>>> id(li) 
38074368 

Как вы можете видеть List = list + [] новый список с другим идентификатором. и поскольку кортеж является неизменным t [2] не получает привязан к новому объекту во втором случае

+4

1. Кортежи ** абсолютно неизменяемы **, но они могут * содержать (ссылки на) изменяемые объекты *. 2. Это не объясняет, почему 't [2] + = [5, 6]' отличается от 't [2] = t [2] + [5, 6]'. – jonrsharpe

+0

@jonrsharpe Я изменил фразу. По относительной неизменности я имел в виду, что он может иметь изменяемые объекты –

+2

Это все еще не охватывает 2. – jonrsharpe