'str'对象不支持Python中的项目赋值

Ras*_*yak 99 python string

我想从字符串中读取一些字符并将其放入其他字符串中(就像我们在C中所做的那样).

所以我的代码如下所示

import string
import re
str = "Hello World"
j = 0
srr = ""
for i in str:
    srr[j] = i #'str' object does not support item assignment 
    j = j + 1
print (srr)
Run Code Online (Sandbox Code Playgroud)

在C中代码可能是

i = j = 0; 
while(str[i] != '\0')
{
srr[j++] = str [i++];
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能在Python中实现相同的功能?

Cro*_*man 92

其他答案是正确的,但你当然可以这样做:

>>> str1 = "mystring"
>>> list1 = list(str1)
>>> list1[5] = 'u'
>>> str1 = ''.join(list1)
>>> print(str1)
mystrung
>>> type(str1)
<type 'str'>
Run Code Online (Sandbox Code Playgroud)

如果你真的想.


NPE*_*NPE 82

在Python中,字符串是不可变的,因此您无法就地更改字符.

但是,您可以执行以下操作:

for i in str:
    srr += i
Run Code Online (Sandbox Code Playgroud)

这有效的原因是它是一个捷径:

for i in str:
    srr = srr + i
Run Code Online (Sandbox Code Playgroud)

上面的内容会在每次迭代时创建一个新字符串,并将对该新字符串的引用存储在其中srr.

  • @RasmiRanjanNayak:`print"".join(reverse("Hello world".split())).capitalize()` (4认同)
  • @aix:这实际上是在几秒之内.:d (2认同)

wim*_*wim 10

Python字符串是不可变的,所以你在C中尝试做的事情在python中根本不可能.您必须创建一个新字符串.

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

然后使用字符串切片:

>>> s1 = 'Hello world!!'
>>> s2 = s1[6:12]
>>> print s2
world!
Run Code Online (Sandbox Code Playgroud)


Bur*_*lid 6

正如 aix 所提到的 - Python 中的字符串是不可变的(您不能就地更改它们)。

您尝试做的事情可以通过多种方式完成:

# Copy the string

foo = 'Hello'
bar = foo

# Create a new string by joining all characters of the old string

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

# Slice and copy
new_string = oldstring[:]
Run Code Online (Sandbox Code Playgroud)


Mat*_*haq 5

高性能方法

\n

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

\n

列表:

\n

最简单也最简单:

\n
s = "TEXT"\ns = list(s)\ns[1] = "_"\ns = "".join(s)\n
Run Code Online (Sandbox Code Playgroud)\n

字节数组(ASCII):

\n

此方法使用较少的内存。内存也是连续的,但如果您无论如何都在进行单元素随机访问,那么在 Python 中这并不重要:

\n
ENC_TYPE = "ascii"\ns = "TEXT"\ns = bytearray(s, ENC_TYPE)\ns[1] = ord("_")\ns = s.decode(ENC_TYPE)\n
Run Code Online (Sandbox Code Playgroud)\n

字节数组(UTF-32):

\n

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

\n
ENC_TYPE = "utf32"\nENC_WIDTH = 4\n\ndef replace(s, i, replacement):\n    start = ENC_WIDTH * (i + 1)\n    end = ENC_WIDTH * (i + 1 + len(replacement))\n    s[start:end] = bytearray(replacement, ENC_TYPE)[ENC_WIDTH:]\n\n\ns = "TEXT HI \xe3\x81\xb2 RA \xe3\x82\x89 GA \xe3\x81\x8c NA \xe3\x81\xaa DONE"\ns = bytearray(s, ENC_TYPE)\nreplace(s, 1, "_")\ns = s.decode(ENC_TYPE)\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n