Skip to main content
 首页 » 编程设计

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

2025年05月04日21duanxz

列表已经有一个用于索引的 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' 

请您参考如下方法:

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

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

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

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

a 似乎已经“改变”为“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" 

如果您需要改变字符串,您可能需要查看 StringIO对于 Python 2,或 io.StringIO对于 Python 3,分别为:

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"