Назначение vs. из среза

При чтении profile.py стандартной библиотеки python я столкнулся с оператором присваивания sys.argv[:] = args, который используется для изменения sys.argv, чтобы профилировать программу, чтобы увидеть правильные аргументы командной строки. Я понимаю, что это отличается от sys.argv = args[:] в действительных операциях, но в действии они выглядят одинаково для меня. Есть ли ситуация, когда нужно использовать одну, а не другую? И a[:] = b общая идиома python?

ОБНОВЛЕНИЕ: в этой конкретной ситуации, почему можно выбрать один за другим? (источник можно найти в функции main profile.py)

Ответ 1

Разница заключается в том, что при использовании a[:] = b это означает, что вы переопределите все, что уже включено в a. Если у вас есть что-то еще со ссылкой на a, оно также изменится, так как оно продолжает ссылаться на одно и то же местоположение.

С другой стороны, a = b[:] создает новую ссылку и копирует все значения из b в эту новую ссылку. Таким образом, существующие ссылки на старые данные будут указывать на старые данные.

Рассмотрим следующий пример:

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = a # c is a reference to the list in a
>>> c
[1, 2, 3]
>>> 
>>> a[:] = b
>>> a # a will have a copy of the list in b
[4, 5, 6] 
>>> c # and c will keep having the same value as a
[4, 5, 6]
>>>
>>> b = [7, 8, 9]
>>> a = b[:]
>>> a # a has the new value
[7, 8, 9]
>>> c # c keeps having the old value
[4, 5, 6]