为什么Python中的字符串没有insert()方法?

时间:2015-06-25 17:55:33

标签: python string

列表已经有一个与索引一起使用的insert()方法:

>>> someList = [1, 2, 4, 5]
>>> someList
[1, 2, 4, 5]
>>> someList.insert(2, 3)
>>> someList
[1, 2, 3, 4, 5]

如果字符串也有索引,为什么不为它们使用insert()方法呢?示例如下:

>>> someString = 'foobar'
>>> someString.insert(3, 'SPAM')
>>> someString
'fooSPAMbar'

5 个答案:

答案 0 :(得分:5)

简答:因为字符串是不可变的。

Python中的每个类型都是可变的(如列表,字典或普通对象),或者是不可变的(如元组,字符串,整数......)。

这就是为什么你可以在列表中追加,弹出和插入,而不是在元组中插入。 当你做这样的事情时:

a = "this"
a = a + "that"

a似乎已经改变了#34;到"thisthat",但实际上,名称a只是指向一个新字符串。如果你把一些东西交给一个函数并尝试在函数中修改它,你可以观察到这种效果:可变类型也会在外面改变(虽然你通常应该避免这些副作用),而不可变的东西赢了:

a = 3
b = [3]
def change_a(something):
    something = 4
def change_b(something):
    something[0] = 4
change_a(a)
change_b(b)
print(a,b) # prints "3 4"

如果您需要改变字符串,您可能需要分别查看Python {2}或Python 3 StringIO

import io
def insert(s,where,what):
    whatlen=len(what)
    s.seek(0)
    cur=len(s.read())
    if cur < where:
        raise IndexError("Can't insert at position {}: Index out of bounds"
                .format(where))
    s.seek(where)
    r=s.read()
    s.seek(where+whatlen)
    s.write(r)
    s.seek(where)
    s.write(what)

s = io.StringIO("This is a test")

insert(s,5,"hello")
s.seek(0)
print(s.read()) #prints "This hellois a test"

答案 1 :(得分:5)

因为字符串是不可变的。您无法更改字符串的内容。你必须创建一个新的字符串。

答案 2 :(得分:1)

因为字符串绝对是不可变的。和元组一样。

答案 3 :(得分:1)

传统字符串是不可变的。您实际上可以使用已弃用的MutableString来执行此操作:

string = UserString.MutableString('foobar') # then insert, call string.insert(3, 'SPAM')

答案 4 :(得分:0)

因此List是一个可变的我们可以在列表中进行更改。但是字符串是不可变的,我们可以将字符串附加到字符串中。但我们无法更改字符串中的索引位置值。