В самом примере, который вы приводите, да, эффекты двух подходов практически идентичны, поскольку оба включают просто присвоение одной и той же ссылки нескольким именам.
Однако следует помнить, что если выражения в целях назначения, предполагающих более сложные оценки, два подхода могут быть разными.
Например, рассмотрим следующее цепочечное выражение, где x
инициализируется как dict, а expensive_func
- функция, отнимающая много времени который возвращает ключ:
x[expensive_func()] = y = some_function()
Хотя он действительно будет эквивалентен следующему:
temp = some_function()
x[expensive_func()] = temp
y = temp
, он не будет эквивалентен второму подходу:
x[expensive_func()] = some_function()
y = x[expensive_func()]
, поскольку expensive_func
необходимо будет вызывать дважды, удваивая затраченное время и дважды вызывая побочный эффект функции, если она есть.
Также рассмотрим следующий код:
obj = []
x = []
x[:] = y = obj
print(id(obj), id(x), id(y))
, где на выходе будет показано, что y
назначается та же ссылка, что и obj
, тогда как x
отличается.
Это тогда код действительно эквивалентен:
obj = []
x = []
temp = obj
x[:] = temp
y = temp
print(id(obj), id(x), id(y))
, но не эквивалентен:
obj = []
x = []
x[:] = obj
y = x[:]
print(id(obj), id(x), id(y))
Последний из которых показывает, что y
получает разные ссылки как от obj
, так и x
.