Здесь важно различать изменяемые и неизменяемые типы данных.В Python список является изменяемым, а кортеж неизменным.Это означает, что когда вы «меняете» значение кортежа следующим образом:
t1 = (1, 2, 3) # t1 points to (1, 2, 3)
t2 = t1 # t2 points to the same tuple as t1
t1 = (2, 3, 4) # t1 points to a new tuple (2, 3, 4)
вы фактически создаете новый кортеж и присваиваете t1
, чтобы указать на этот новый кортеж.t2
по-прежнему указывает на старый кортеж, который нельзя изменить, потому что кортежи неизменны.Короче говоря, если вы присваиваете неизменное значение переменной, вы можете предположить, что это значение никогда не изменится - если только вы явно не назначите новое значение переменной.
Но когда вы изменяете значение списка,вы фактически меняете сам список:
l1 = [1, 2, 3] # l1 points to [1, 2, 3]
l2 = l1 # l2 points to the same list as l1
l1[0] = 5 # now [1, 2, 3] becomes [5, 2, 3]
Поскольку l1
и l2
оба указывают на один и тот же список, они оба изменяются при изменении одного из них.
Чтобы сделать копию, которая не изменится при изменении l1
, просто используйте list
:
l2 = list(l1)
или используйте обозначение фрагмента:
l2 = l1[:]