Что делает двоеточие при назначении для списка [:] = [...] в Python

Я пришел по следующему коду:

# O(n) space       
def rotate(self, nums, k):
    deque = collections.deque(nums)
    k %= len(nums)
    for _ in xrange(k):
        deque.appendleft(deque.pop())
    nums[:] = list(deque) # <- Code in question

Что делает nums[:] =, что nums = нет? В этом случае, что делает nums[:], что nums не?

Ответ 1

Этот синтаксис является назначением фрагмента. Срез [:] означает весь список. Разница между nums[:] = и nums = заключается в том, что последний не заменяет элементы в исходном списке. Это наблюдается, когда есть две ссылки на список

>>> original = [1, 2, 3]
>>> other = original
>>> original[:] = [0, 0] # changes what both original and other refer to 
>>> other # see below, now you can see the change through other
[0, 0]

Чтобы увидеть разницу, просто удалите [:] из задания выше.

>>> original = [1, 2, 3]
>>> other = original
>>> original = [0, 0] # original now refers to a different list than other
>>> other # other remains the same
[1, 2, 3]

Если буквально воспринимать заголовок вашего вопроса, если list - это имя переменной, а не встроенная переменная, он заменит длину последовательности на многоточие

>>> list = [1,2,3,4]
>>> list[:] = [...]
>>> list
[Ellipsis]

Ответ 2

nums = foo возвращает имя nums для ссылки на тот же объект, на который ссылается foo.

nums[:] = foo вызывает назначение среза для объекта, на который ссылается nums, тем самым делая содержимое исходного объекта копией содержимого foo.

Попробуйте следующее:

>>> a = [1,2]
>>> b = [3,4,5]
>>> c = a
>>> c = b
>>> print(a)
[1, 2]
>>> c = a
>>> c[:] = b
>>> print(a)
[3, 4, 5]