Подтвердить что ты не робот

Python Удалите последнюю строку char из строки и верните ее

Пока я знаю, что есть возможность:

>>> a = "abc"
>>> result = a[-1]
>>> a = a[:-1]

Теперь я также знаю, что строки неизменяемы и поэтому что-то вроде этого:

>>> a.pop()
c

невозможно.

Но действительно ли это предпочтительный способ?

4b9b3361

Ответ 1

Строки "непреложны" по уважительной причине: это действительно экономит много головных болей, чаще, чем вы думаете. Это также позволяет питону быть очень умным в оптимизации их использования. Если вы хотите обрабатывать свою строку с шагом, вы можете вытащить ее часть с помощью split() или разделить ее на две части с помощью индексов:

a = "abc"
a, result = a[:-1], a[-1]

Это показывает, что вы разделили строку на две части. Если вы будете изучать каждый байт строки, вы можете перебирать его (в обратном порядке, если хотите):

for result in reversed(a):
    ...

Я должен добавить это, кажется, немного надуманный: у вашей строки, скорее всего, будет какой-то разделитель, а затем вы будете использовать split:

ans = "foo,blah,etc."
for a in ans.split(","):
    ...

Ответ 2

Не только это предпочтительный способ, но и единственный разумный способ. Поскольку строки являются неизменяемыми, чтобы "удалить" char из строки, вам нужно создать новую строку всякий раз, когда вам нужно другое строковое значение.

Возможно, вам интересно, почему строки неизменяемы, учитывая, что вы должны создавать новую строку при каждом изменении символа. В конце концов, строки C представляют собой просто массивы символов и, таким образом, изменяемы, а некоторые языки, которые поддерживают строки более чисто, чем C, также допускают изменчивые строки. Есть две причины иметь неизменные строки: безопасность/безопасность и производительность.

Безопасность, вероятно, является самой важной причиной для неизменяемости строк. Когда строки неизменяемы, вы не можете передать строку в какую-либо библиотеку, а затем изменить эту строку под ногами, когда вы этого не ожидаете. Вы можете задаться вопросом, какая библиотека изменит параметры строки, но если вы отправляете код клиентам, вы не можете контролировать их версии стандартной библиотеки, а вредоносные клиенты могут изменить свои стандартные библиотеки, чтобы разорвать вашу программу и узнать больше о его внутренностях. Неизбежные объекты также легче рассуждать, что очень важно, когда вы пытаетесь доказать, что ваша система защищена от конкретных угроз. Эта простота рассуждений особенно важна для безопасности потоков, поскольку неизменяемые объекты автоматически поточно-безопасны.

Производительность на удивление часто бывает лучше для неизменяемых строк. Всякий раз, когда вы берете фрагмент строки, среда выполнения Python только размещает представление поверх исходной строки, поэтому нет нового распределения строк. Поскольку строки неизменяемы, вы получаете семантику копирования без фактического копирования, что является реальной победой в производительности.

Эрик Липперт больше объясняет обоснование неизменяемых строк (в С#, а не Python) здесь.

Ответ 3

Точная формулировка вопроса заставляет меня думать, что это невозможно.

return для меня означает, что у вас есть функция, в которую вы передали строку как параметр.

Вы не можете изменить этот параметр. Присвоение ему только изменяет значение параметра внутри функции, а не передается в строке. Например.

>>> def removeAndReturnLastCharacter(a):
        c = a[-1]
        a = a[:-1]
        return c

>>> b = "Hello, Gaukler!"
>>> removeAndReturnLastCharacter(b)
!

>>> b    # b has not been changed
Hello, Gaukler!

Ответ 4

Да, строки python неизменяемы, и любая модификация приведет к созданию новой строки. Вот как это делается в основном.

Итак, продолжайте.