虽然我知道有可能:
>>> a = "abc"
>>> result = a[-1]
>>> a = a[:-1]
现在我也知道字符串是不可变的,因此是这样的:
>>> a.pop()
c
是不可能的。
但这真的是首选吗?
答案 0 :(得分:31)
字符串是“不可变的”有充分的理由:它确实比你想象的更经常地避免了很多麻烦。它还允许python非常聪明地优化其使用。如果您想以增量方式处理字符串,可以使用split()
取出部分字符串,或者使用索引将其分成两部分:
a = "abc"
a, result = a[:-1], a[-1]
这表明您将字符串分成两部分。如果你要检查字符串的每个字节,你可以迭代它(反过来,如果你愿意):
for result in reversed(a):
...
我应该补充说这似乎有点做作:你的字符串更可能有一些分隔符,然后你将使用split
:
ans = "foo,blah,etc."
for a in ans.split(","):
...
答案 1 :(得分:5)
它不仅是首选方式,而且是唯一合理的方式。因为字符串是不可变的,所以为了从字符串中“删除”字符,只要你想要一个不同的字符串值,就必须创建一个新的字符串。
您可能想知道为什么字符串是不可变的,因为每次更改字符时都必须创建一个全新的字符串。毕竟,C字符串只是字符数组,因此是可变的,并且一些支持字符串比C更干净的语言也允许可变字符串。拥有不可变字符串有两个原因:安全性/安全性和性能。
安全性可能是字符串不可变的最重要原因。当字符串是不可变的时,你不能将一个字符串传递给某个库,然后当你不期望它时,让你的脚下的字符串发生变化。您可能想知道哪个库会更改字符串参数,但如果您要将代码发送到客户端,则无法控制其标准库的版本,恶意客户端可能会更改其标准库以破坏您的程序并了解更多信息关于它的内部。不可变对象也更容易推理,当您尝试证明您的系统对特定威胁是安全的时,这非常重要。这种易于推理对于线程安全尤其重要,因为不可变对象是自动线程安全的。
对于不可变字符串,性能通常更好。每当你获取一个字符串片段时,Python运行时只会在原始字符串上放置一个视图,因此没有新的字符串分配。由于字符串是不可变的,因此您无需实际复制即可获得复制语义,这是一个真正的性能获胜。
Eric Lippert详细解释了不可变字符串背后的基本原理(在C#中,而不是Python)here。
答案 2 :(得分:3)
问题的准确措辞让我觉得这是不可能的。
return
对我来说意味着你有一个函数,你已经将一个字符串作为参数传递。
您无法更改此参数。分配给它只会改变函数中参数的值,而不是传入的字符串。 E.g。
>>> def removeAndReturnLastCharacter(a):
c = a[-1]
a = a[:-1]
return c
>>> b = "Hello, Gaukler!"
>>> removeAndReturnLastCharacter(b)
!
>>> b # b has not been changed
Hello, Gaukler!
答案 3 :(得分:1)
是的,python字符串是不可变的,任何修改都会导致创建一个新字符串。这就是它主要完成的方式。
所以,继续吧。
答案 4 :(得分:0)
我决定使用for循环,只是避免出现问题,这是可以接受的替代方法吗?
new = ''
for item in str:
if item == str[n]:
continue
else:
new += item