我想从字符串s1中读取一些字符,并将其放入另一个字符串s2中。

但是,赋值给s2[j]会给出一个错误:

s2[j] = s1[i]

# TypeError: 'str' object does not support item assignment

在C语言中,这是可行的:

int i = j = 0;
while (s1[i] != '\0')
    s2[j++] = s1[i++];

我在Python中的尝试:

s1 = "Hello World"
s2 = ""
j = 0

for i in range(len(s1)):
    s2[j] = s1[i]
    j = j + 1

当前回答

str是一个不可变的数据类型。因此,str类型对象不支持项赋值。

s1 = "Hello World"
s2 = ['']*len(s1)
j = 0
for i in range(len(s1)):
s2[j]=s1[i]
j = j + 1
print(''.join(s2)) # Hello World

其他回答

在Python中,字符串是不可变的,所以不能就地更改它们的字符。

但是,你可以做以下的事情:

for c in s1:
    s2 += c

这样做的原因是,它是一个快捷方式:

for c in s1:
    s2 = s2 + c

上面的代码在每次迭代时创建一个新字符串,并将对新字符串的引用存储在s2中。

给s2[j]赋值会出错

字符串是不可变的,所以你在C中所做的在Python中是不可能的。相反,您必须创建一个新的字符串。

我想从字符串中读取一些字符并将其放入 其他字符串。

用切片:

>>> s1 = 'Hello world!!'
>>> s2 = s1[6:12]
>>> print(s2)
world!

Python中的字符串是不可变的(你不能就地更改它们)。

你想做的事情可以通过很多方式来实现:

复制字符串:

foo = 'Hello'
bar = foo

通过连接旧字符串的所有字符创建一个新字符串:

new_string = ''.join(c for c in oldstring)

切片和复制:

new_string = oldstring[:]

性能的方法

如果经常执行索引替换,一种性能更好、内存更紧凑的方法是转换为不同的数据结构。然后,当你完成时,转换回字符串。

列表:

最简单和最简单:

s = "TEXT"
s = list(s)
s[1] = "_"
s = "".join(s)

bytearray(的ASCII):

这种方法使用较少的内存。内存也是连续的,尽管在Python中,如果你做的是单元素随机访问,这并不太重要:

ENC_TYPE = "ascii"
s = "TEXT"
s = bytearray(s, ENC_TYPE)
s[1] = ord("_")
s = s.decode(ENC_TYPE)

中bytearray (utf - 32):

更一般地,对于基本ASCII集之外的字符,我建议使用UTF-32(有时是UTF-16),这将确保随机访问的对齐:

ENC_TYPE = "utf32"
ENC_WIDTH = 4

def replace(s, i, replacement):
    start = ENC_WIDTH * (i + 1)
    end = ENC_WIDTH * (i + 2)
    s[start:end] = bytearray(replacement, ENC_TYPE)[ENC_WIDTH:]


s = "TEXT HI ひ RA ら GA が NA な DONE"
s = bytearray(s, ENC_TYPE)

# Performs s[1] = "_"
replace(s, 1, "_")

s = s.decode(ENC_TYPE)

尽管这种方法可能比使用list更节省内存,但它确实需要更多的操作。

str是一个不可变的数据类型。因此,str类型对象不支持项赋值。

s1 = "Hello World"
s2 = ['']*len(s1)
j = 0
for i in range(len(s1)):
s2[j]=s1[i]
j = j + 1
print(''.join(s2)) # Hello World