克服“缺点”字符串不变性

发布于 2024-08-20 03:21:09 字数 237 浏览 4 评论 0原文

我想更改特定字符串索引的值,但不幸的是

string[4] = "a"

引发了 TypeError,因为字符串是不可变的(“不支持项目分配”)。

因此,我使用相当笨拙的方法

string = string[:4] + "a" + string[4:]

是否有更好的方法来做到这一点?

I want to change the value of a particular string index, but unfortunately

string[4] = "a"

raises a TypeError, because strings are immutable ("item assignment is not supported").

So instead I use the rather clumsy

string = string[:4] + "a" + string[4:]

Is there a better way of doing this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

凉墨 2024-08-27 03:21:09

Python 中的字符串是不可变的,就像数字和元组一样。这意味着您可以创建它们、移动它们,但不能更改它们。为什么会这样呢?出于以下几个原因(您可以在网上找到更好的讨论):

  • 根据设计,Python 中的字符串被认为是基本的且不可更改的。这激发了更好、更安全的编程风格。
  • 字符串的不变性具有效率优势,主要体现在较低的存储要求方面。
  • 它还使字符串更安全地用作字典键

如果你稍微浏览一下 Python 网络,你会注意到“如何更改我的字符串”最常见的建议是“设计你的代码,这样你就不必改变它”。很公平,但是还有什么其他选择呢?这里有一些:

  • name = name[:2] + 'G' + name[3:] - 这是一种低效的工作方式。 Python 的切片语义确保它在所有情况下都能正确工作(只要索引在范围内),但涉及多个字符串副本和串联,这很难成为高效代码的最佳选择。尽管如果您不关心这一点(而且很可能您不关心),那么这是一个可靠的解决方案。
  • 使用 UserString 模块中的 MutableString 类。虽然并不比以前的方法更有效(它在幕后执行相同的技巧),但它在语法上与正常字符串使用更加一致。
  • 使用列表而不是字符串来存储可变数据。使用列表和连接来回转换。根据您的真正需要,ord 和 chr 也可能有用。
  • 使用数组对象。如果您使用字符串来保存受限数据(例如“二进制”字节)并且想要快速代码,这可能是您的最佳选择。

抄袭自我自己的关于 Python 见解的页面 :-)

The strings in Python are immutable, just like numbers and tuples. This means that you can create them, move them around, but not change them. Why is this so ? For a few reasons (you can find a better discussion online):

  • By design, strings in Python are considered elemental and unchangeable. This spurs better, safer programming styles.
  • The immutability of strings has efficiency benefits, chiefly in the area of lower storage requirements.
  • It also makes strings safer to use as dictionary keys

If you look around the Python web a little, you’ll notice that the most frequent advice to "how to change my string" is "design your code so that you won’t have to change it". Fair enough, but what other options are there ? Here are a few:

  • name = name[:2] + ‘G’ + name[3:] - this is an inefficient way to do the job. Python’s slice semantics ensure that this works correctly in all cases (as long as your index is in range), but involving several string copies and concatenations, it’s hardly your best shot at efficient code. Although if you don’t care for that (and most chances are you don’t), it’s a solid solution.
  • Use the MutableString class from module UserString. While no more efficient than the previous method (it performs the same trick under the hood), it is more consistent syntactically with normal string usage.
  • Use a list instead of a string to store mutable data. Convert back and forth using list and join. Depending on what you really need, ord and chr may also be useful.
  • Use an array object. This is perhaps your best option if you use the string to hold constrained data, such as ‘binary’ bytes, and want fast code.

Plagiarized from my own page on Python insights :-)

倾其所爱 2024-08-27 03:21:09
mystring=list("abcdef")
mystring[4]="Z"
print ''.join(mystring)
mystring=list("abcdef")
mystring[4]="Z"
print ''.join(mystring)
花落人断肠 2024-08-27 03:21:09
>>> from UserString import MutableString
>>> s = MutableString('abcd')
>>> s[2] = 'e'
>>> print s
abed
>>> from UserString import MutableString
>>> s = MutableString('abcd')
>>> s[2] = 'e'
>>> print s
abed
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文