В чем разница между этими двумя линиями?

#python #python-3.x

#python #python-3.x

Вопрос:

 friends = my[:] #1
friends[:] = my #2
 

обе переменные могут быть списковыми или строковыми, то есть итеративными. Я изучаю python.

  1. Я не понимаю, как работают эти строки. Не могли бы вы подробнее рассказать о них, пожалуйста?
  2. В чем разница между двумя строками?

Комментарии:

1. Для строки 2 friends на самом деле это не может быть строка. Я попробовал это и получил TypeError: 'str' object does not support item assignment

Ответ №1:

Первая строка повторно friends привязывается к новой последовательности, которая является поверхностной копией my (на самом деле, она может делать все, что угодно, но при my условии, что это не a memoryview или странный сторонний тип, такой как numpy array, обычно это поверхностная копия всей последовательности).

Вторая строка переназначает содержимое friends (которое должно быть изменяемым) на то, что находится в итерируемом my (опять же, странные переопределения friends могут изменить это); my не обязательно должна быть последовательность, простой итератор также будет работать и будет исчерпан в процессе заполнения friends .

В обоих случаях это поверхностная копия (переназначение или добавление / добавление элементов my после любой строки не изменится friends ). Основное отличие заключается в том, что первая строка представляет собой повторную привязку к новой последовательности, в то время как последняя изменяется friends на месте. Это важно в двух отношениях:

  1. Псевдонимирование: если какое-либо другое имя привязано к той же последовательности, friends что и , первый вариант не влияет на псевдоним (повторная привязка отбрасывает старую ссылку, поэтому другие псевдонимы сохраняют ее friends ), в то время как второй вариант изменяет другие псевдонимы
  2. Сохранение типа: второй вариант не изменяет тип friends , он просто заменяет содержимое. Первому варианту все равно, что friends было раньше (это может быть не последовательность, например int ), он заканчивается тем, что производит нарезка (например, если my это a list , friends становится a list позже).

Конкретный пример использования этой настройки:

 friends = [1, 2, 3]
alsofriends = friends
my = (4, 5, 6)
 

Если вы используете строку 1, то после этой строки friends есть (4, 5, 6) и alsofriends все еще [1, 2, 3] есть (это больше не связано с friends ).

Если вы используете строку 2, то после этой строки friends is [4, 5, 6] (содержимое из my , но все равно a list ), и alsofriends теперь [4, 5, 6] также (это все еще псевдоним friends , и содержимое общего list доступа теперь соответствует тому, что было скопировано из my ).