为什么Python中没有字符串的insert()方法?
列表已具有可用于索引的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' >>>
>>> 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似乎没有问题中描述的任何方法。