@masergeev

Метод copy и присваивание одной переменной значения другой. Что не так?

Во всех учебниках по python пишут, что знак равенства "=" в Python лишь создает ссылку одной переменной на другую и при изменении одной из них мы тем самым поменяем другую. Для копирования значения переменной следует использовать метод copy, но у меня все нормально работает и со знаком равенства (=), пример ниже:
var1 = "Переменная"
print (id (var1))
var2 = var1
print (id (var2))
var2 = "Новая переменная"
print (id (var1))
print (id (var2))
print (var1)

Результат:
1989391115728
1989391115728
1989391115728
1989391081744
Переменная

В итоге переменная var2 действительно имеет тот же идентификатор, что и var1, но лишь до того момента, пока я не поменяю ее значение. Что я делаю не так?

Все верно, т.к. в данном случае мы присваиваем значение новой переменной.
Если попробовать сделать так:
var1 = [1, 2]
print (id (var1))
var2 = var1
print (id (var2))
var1.append(4)
print (id (var1))
print (id (var2))
print (var2)

Мы увидим:
2222837998088
2222837998088
2222837998088
2222837998088
[1, 2, 4]

Т.е. не изменяя значение var2 метдом append к var1 мы все-таки изменили ее.

При использования метода copy все проходит должным образом:
import copy
var1 = [1, 2]
print (id (var1))
var2 = copy.copy(var1)
print (id (var2))
var1.append(4)
print (id (var1))
print (id (var2))
print (var2)

Результат:
2222837957064
2222838953032
2222837957064
2222838953032
[1, 2]
  • Вопрос задан
  • 2221 просмотр
Пригласить эксперта
Ответы на вопрос 3
@Al6xand6r
Так все верно. Здесь var2 = var1 вы получили ссылку на ту же область памяти, что и var1.
А здесь var2 = "Новая переменная" уже на другую. При этом ссылка в var1 не изменилась.
Ответ написан
@EgorSvinarev
После того, как вы поменяете значение переменной var2, ее ссылка тоже изменится. Т.е. когда вы "присваиваете" (на самом деле не присваиваете) переменной val2 значение переменной val1, вы кладете ссылку в эту переменную на объект, к которому ссылается переменная val1. Отсюда одинаковые идентификаторы объектов. А уже потом, когда вы второй раз присваиваете переменной val2 новое значение, в памяти создается новый объект, и в переменную передается ссылка на него.
Используя copy(), вы создаете новый объект в памяти с такими же значениями, что у копируемого, а не передаете переменной ссылку на родительский объект. В это вся разница.
Ответ написан
@Drill
Почитайте уже про типы данных в Python.
А конкретно про изменяемые (mutable) и неизменяемые (unmutable) типы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы