2

One question that I faced today, which actually tested the immutability of the tuples in Python:

  • Interviewer: Are tuples immutable in Python?

  • Me: Yes

  • Interviewer: So what does print(t1) here print?

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

  • Interviewer: How does immutability of tuple then define this behavior?

  • Me: It's got nothing to do with immutability, t1 label is referring to a new tuple.

  • Interviewer:

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

    What will happen next?

  • Me: TypeError is raised

  • Interviewer: What will be the value of t be after that?

  • Me: (1, 2, [3, 4]) or (1, 2, [3, 4, 5, 6]) maybe, not sure

  • Interviewer: What made you think the value will change to (1, 2, [3, 4, 5, 6]) and what will happen if I write

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

    will t2 still be (1, 2, [3, 4, 5, 6]) after this operation?

jonrsharpe
  • 115,751
  • 26
  • 228
  • 437
  • 2
    Yes, tuples are immutable, but they can hold references to mutable objects. – jonrsharpe Sep 26 '15 at 16:25
  • 4
    Tuple as a container is immutable, that means you cannot remove or add items to it, but the items it contains can be mutated. Also read: [Why does `a_tuple[i] += [‘item’]` raise an exception when the addition works?](https://docs.python.org/2/faq/programming.html#why-does-a-tuple-i-item-raise-an-exception-when-the-addition-works) – Ashwini Chaudhary Sep 26 '15 at 16:27

1 Answers1

3

Even though the tuples are immutable, the object inside it can be mutuable

Since in >>> t = (1, 2, [3, 4]) the list is mutable so you can change the list value with Augmented assignment. += but then the exception is raised.

here the t[2] list is modified as you can see

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

As you can see the t[2] id never gets changed.

enter image description here

As for the second case: t[2] = t[2] + [5,6] - it creates a new list and then assign it to t[2]

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

As you can see List = list + [] is a new list with a different id. and as the tuple is immutable t[2] doesn't get assigned to a new object in the second case

boardrider
  • 5,882
  • 7
  • 49
  • 86
Ankur Anand
  • 3,873
  • 2
  • 23
  • 44