#python #python-3.x
#python #python-3.x
Вопрос:
friends = my[:] #1
friends[:] = my #2
обе переменные могут быть списковыми или строковыми, то есть итеративными. Я изучаю python.
- Я не понимаю, как работают эти строки. Не могли бы вы подробнее рассказать о них, пожалуйста?
- В чем разница между двумя строками?
Комментарии:
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
на месте. Это важно в двух отношениях:
- Псевдонимирование: если какое-либо другое имя привязано к той же последовательности,
friends
что и , первый вариант не влияет на псевдоним (повторная привязка отбрасывает старую ссылку, поэтому другие псевдонимы сохраняют ееfriends
), в то время как второй вариант изменяет другие псевдонимы - Сохранение типа: второй вариант не изменяет тип
friends
, он просто заменяет содержимое. Первому варианту все равно, чтоfriends
было раньше (это может быть не последовательность, напримерint
), он заканчивается тем, что производит нарезка (например, еслиmy
это alist
,friends
становится alist
позже).
Конкретный пример использования этой настройки:
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
).