Ответ 1
Назначение в python никогда не создает копию (это технически возможно, только если назначение для члена класса переопределено, например, с помощью __setattr__
, свойств или дескрипторов).
Итак, после
a = foo()
b = a
все, что было возвращено из foo
, не было скопировано, и вместо этого у вас есть две переменные a
и b
, указывающие на один и тот же объект. Независимо от того, является ли объект неизменным или нет.
С неизменяемыми объектами, однако трудно сказать, так ли это (потому что вы не можете мутировать объект с помощью одной переменной и проверить, видно ли изменение с помощью другого), поэтому вы можете думать, что действительно a
и b
не могут влиять друг на друга.
Для некоторых неизменяемых объектов Python может повторно использовать старые объекты вместо создания новых и после
a = x + y
b = x + y
где оба x
и y
являются числами (поэтому сумма является числом и является неизменной) может заключаться в том, что оба a
и b
будут указывать на один и тот же объект. Обратите внимание, что такой гарантии нет... может быть также, что вместо этого они будут указывать на разные объекты с одинаковым значением.
Важно помнить, что Python никогда не делает копию, если специально не указано, что нужно использовать, например, copy
или deepcopy
. Это важно с изменяемыми объектами, чтобы избежать сюрпризов.
Например, вы можете увидеть одну общую идиому:
class Polygon:
def __init__(self, pts):
self.pts = pts[:]
...
В этом случае вместо self.pts = pts
используется self.pts = pts[:]
, чтобы сделать копию всего массива точек, чтобы убедиться, что список точек не изменится неожиданно, если после создания изменений объекта применяются к списку, который был передается конструктору.