Редактировать:
Должно быть понятно, что список является объектом и является изменяемым .
Поэтому при изменении элементаНапример, item = [1, 2] с item [0] = 5 item теперь будет [5, 2].Если вы помещаете элемент в скажем ... другой список несколько раз или, для ясности, в кортеж (которые являются неизменяемыми объектами), ссылки на элементы не изменяются, но содержимое элементов изменяется.
Пример выше:
In [162]: foo = [1, 2]
In [163]: bar = (foo, foo, foo)
In [164]: bar
Out[164]: ([1, 2], [1, 2], [1, 2])
In [165]: foo[0] = 5
In [166]: bar
Out[166]: ([5, 2], [5, 2], [5, 2])
Вы можете быть сбиты с толку, но это действительно поражает.Кортеж не изменился и не может изменить .Кортеж просто содержит ссылку на объект, который мы не меняем, изменяя содержимое элемента.Ниже приведен пример, иллюстрирующий эти моменты.
In [167]: baz = [1, 2, 3]
In [168]: bar[0] = baz
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/Users/litzomatic/Dev/sqlalchemypy/<ipython-input-168-a23696d7bc75> in <module>()
----> 1 bar[0] = baz
TypeError: 'tuple' object does not support item assignment
In [169]: foo.extend(baz)
In [170]: bar
Out[170]: ([5, 2, 1, 2, 3], [5, 2, 1, 2, 3], [5, 2, 1, 2, 3])
In [171]: baz[0] = 6
In [172]: bar
Out[172]: ([5, 2, 1, 2, 3], [5, 2, 1, 2, 3], [5, 2, 1, 2, 3])
Теперь, что нам делать, если мы не хотим такого поведения?Вам нужно создать несколько объектов , а не только один.В Python со списками для этого есть простой синтаксис.
In [174]: bar = (foo[:], foo[:], foo[:])
In [175]: bar
Out[175]: ([5, 2, 1, 2, 3], [5, 2, 1, 2, 3], [5, 2, 1, 2, 3])
In [176]: foo[0] = 10
In [177]: foo
Out[177]: [10, 2, 1, 2, 3]
In [178]: bar
Out[178]: ([5, 2, 1, 2, 3], [5, 2, 1, 2, 3], [5, 2, 1, 2, 3])
Вы можете подтвердить, что происходит, используя оператор is
для сравнения ссылок на объекты.
In [179]: bar[0] is foo
Out[179]: False
In [180]: bar = (foo, foo, foo)
In [181]: bar[0] is foo
Out[181]: True
In [182]: foo[0] = 15
In [183]: bar[0] is foo
Out[183]: True
In [184]: bar
Out[184]: ([15, 2, 1, 2, 3], [15, 2, 1, 2, 3], [15, 2, 1, 2, 3])