Python从字符串中删除最后一个字符并返回它

Dav*_*ter 19 python

虽然我知道有可能:

>>> a = "abc"
>>> result = a[-1]
>>> a = a[:-1]
Run Code Online (Sandbox Code Playgroud)

现在我也知道字符串是不可变的,因此是这样的:

>>> a.pop()
c
Run Code Online (Sandbox Code Playgroud)

不可能.

但这真的是首选方式吗?

ale*_*xis 31

字符串是"不可改变的"有充分的理由:它确实比你想象的更容易出现很多麻烦.它还允许python非常聪明地优化其使用.如果要以增量方式处理字符串,可以split()使用索引将其中的一部分拉出或分成两部分:

a = "abc"
a, result = a[:-1], a[-1]
Run Code Online (Sandbox Code Playgroud)

这表明您将字符串分成两部分.如果你要检查字符串的每个字节,你可以迭代它(反过来,如果你愿意):

for result in reversed(a):
    ...
Run Code Online (Sandbox Code Playgroud)

我应该添加这似乎有点做作:你的字符串更可能有一些分隔符,然后你将使用split:

ans = "foo,blah,etc."
for a in ans.split(","):
    ...
Run Code Online (Sandbox Code Playgroud)


Ada*_*cin 5

它不仅是首选方式,而且是唯一合理的方式.因为字符串是不可变的,所以为了从字符串中"删除"字符,只要需要不同的字符串值,就必须创建一个新的字符串.

您可能想知道为什么字符串是不可变的,因为每次更改字符时都必须创建一个全新的字符串.毕竟,C字符串只是字符数组,因此是可变的,并且一些支持字符串比C更干净的语言也允许可变字符串.拥有不可变字符串有两个原因:安全性/安全性和性能.

安全性可能是字符串不可变的最重要原因.当字符串是不可变的时,你不能将一个字符串传递给某个库,然后当你不期望它时,让你的脚下的字符串发生变化.您可能想知道哪个库会更改字符串参数,但如果您要将代码发送到客户端,则无法控制其标准库的版本,恶意客户端可能会更改其标准库以破坏您的程序并了解更多信息关于它的内部.不可变对象也更容易推理,当您尝试证明您的系统对特定威胁是安全的时,这非常重要.这种易于推理对于线程安全尤其重要,因为不可变对象是自动线程安全的.

对于不可变字符串,性能通常更好.每当你获取一个字符串片段时,Python运行时只会在原始字符串上放置一个视图,因此没有新的字符串分配.由于字符串是不可变的,因此您无需实际复制即可获得复制语义,这是一个真正的性能获胜.

埃里克利珀详细解释了背后的字符串的不可变的理由(在C#中,而不是Python)在这里.


Pet*_*ood 5

这个问题的精确措辞让我认为这是不可能的。

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!
Run Code Online (Sandbox Code Playgroud)