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

为什么Python中没有字符串的insert()方法?,python,string,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' >>>

列表已具有可用于索引的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似乎已更改为this that,但实际上,名称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:

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"
简短回答:因为字符串是不可变的。 Python中的每种类型要么像列表、字典或普通对象一样是可变的,要么像元组、字符串、整数等一样是不可变的

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

a = "this"
a = a + "that"
a似乎已更改为this that,但实际上,名称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:

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"

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

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

因为字符串是绝对不可变的。元组也是如此。

因为字符串是绝对不可变的。元组也是如此。

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

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

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

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

因此,列表是可变的,我们可以在列表中进行更改。但是字符串是不可变的,我们可以在字符串中附加字符。但是我们不能更改字符串中的索引位置值。

因此列表是可变的,我们可以在列表中进行更改。但是字符串是不可变的,我们可以在字符串中附加字符。但是我们不能更改字符串中的索引位置值。

字符串是不可变的,duh!字符串是不可变的!我相信MutableString实际上是通过列表内部化的。我相信MutableString实际上是通过列表内部化的。MutableString可能值得一提。MutableString在Python 2中不受欢迎,在Python 3中不存在。是的,我知道。但如果他正在寻找一个解决方案,那是一个不错的选择。我为StringIO添加了一个引用,比如可变字符串。因为他们没有指定他们正在使用的Python版本,所以我假设最近的一个版本。StringIO似乎没有问题中描述的任何方法。MutableString可能值得一提。MutableString在Python 2中不受欢迎,在Python 3中不存在。是的,我知道。但如果他正在寻找一个解决方案,那是一个不错的选择。我为StringIO添加了一个引用,比如可变字符串。因为他们没有指定他们正在使用的Python版本,所以我假设最近的一个.StringIO似乎没有问题中描述的任何方法。