переменные Python - PullRequest
       17

переменные Python

1 голос
/ 01 мая 2011

У меня простой вопрос.Я прочитал строку из файла и хранится в списке (названный: формула).Затем я сохранил (формула) в другой переменной (fstore = формула), чтобы сохранить его на потом.Затем я внес изменения в формулу, и, как оказалось, fstore тоже меняется.Почему это происходит?Я хочу, чтобы fstore оставался постоянным.Я не использовал fstore где-либо еще в программе.Мое назначение (fstore = формула) неверно?

Jay

Ответы [ 2 ]

5 голосов
/ 01 мая 2011

Здесь важно различать изменяемые и неизменяемые типы данных.В 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[:]
4 голосов
/ 01 мая 2011

Помните, что эти имена в Python - это не переменные, а ссылки на переменные. Таким образом, вы получаете два псевдонима для одного магазина. Взгляните на модуль копирования или используйте это:

 cpy = mystr[:]
...