#python #string
#python #строка
Вопрос:
Я хочу знать, если, когда я делаю что-то вроде
a = "This could be a very large string..."
b = a[:10]
создается новая строка или возвращается представление / итератор
Комментарии:
1. Обратите внимание, что вы можете использовать
itertools.islice
для последнего.2. Что вы узнали, когда вы запустили его и использовали
id()
для проверки подлинности объекта?3. @S.Лотт: Представление будет отличаться
id()
от объекта, для которого оно было представлением. Так что на самом деле это вас ничему не научит. Выполнениеtype()
более полезно.
Ответ №1:
Python выполняет срез по копированию, то есть каждый раз, когда вы выполняете срез (за исключением очень тривиальных срезов, таких a[:]
как), он копирует все данные в новый объект string.
По словам одного из разработчиков, этот выбор был сделан потому, что
Подход [срез по ссылке] более сложный, его сложнее реализовать и он может привести к неожиданному поведению.
Например:
a = "длинная строка с 500 000 символов ..." b = a[0] del aС дизайном «срез как копия» строка
a
немедленно освобождается. Дизайн среза как ссылки сохранит строку размером 500 КБ в памяти, хотя вас интересует только первый символ.
По-видимому, если вам абсолютно нужно представление строки, вы можете использовать memoryview
объект.
Комментарии:
1. @BlueRaja-Danny-Pflughoeft Каковы другие возможные виды тривиальных срезов?
2. @sandeeps однобайтовые фрагменты, пустой фрагмент
3. Если я это сделаю
word='python' word[2:3] == word[2:-3]
, я получуtrue
. И если я сравниваюid(word[2:3])
иid(word[2:-3])
, они одинаковы. Означает ли это, что при срезе python выполняет некоторую интернирующую работу для идентичных строк?4.
memoryview
на самом деле не помогает для строк, потому что он работает только с объектами, которые поддерживают протокол buffer, такими какbytes
иbytearray
Ответ №2:
Когда вы срезаете строки, они возвращают новый экземпляр String. Строки являются неизменяемыми объектами.
Комментарии:
1. Хотя это и верно, это не отвечает на вопрос: он спрашивает, копируются ли данные или нет.
2. Это причина, по которой вы ожидаете, что представления среза не будут копировать. Одно из распространенных применений неизменяемых данных заключается в том, что вместо них легко передавать ссылки. Итак, мне любопытно, почему в Python он выполняет копирование.