【问题标题】:Python Remove last char from string and return itPython从字符串中删除最后一个字符并返回它
【发布时间】:2012-03-27 05:45:53
【问题描述】:

虽然我知道有这种可能性:

>>> a = "abc"
>>> result = a[-1]
>>> a = a[:-1]

现在我也知道字符串是不可变的,因此是这样的:

>>> a.pop()
c

不可能。

但这真的是首选方式吗?

【问题讨论】:

  • 我尝试添加,不知道为什么不起作用。
  • 这真的取决于你想要做什么以及优化代码的重要性。我认为在大多数情况下,最好只返回一个新字符串,而不是创建另一种类型或使用列表。
  • 如果您必须经常这样做,请重新考虑您的算法。
  • 你也可以这样做:list(a) >> a.pop() >> a = "".join(a)
  • 您需要缩短的字符串还是只需要弹出的字符(以及下一个弹出的字符和下一个...)?

标签: python


【解决方案1】:

字符串是“不可变的”有充分的理由:它确实可以省去很多麻烦,而且比您想象的更频繁。它还允许 python 非常聪明地优化它们的使用。如果您想以增量方式处理您的字符串,您可以使用split() 提取部分字符串或使用索引将其分成两部分:

a = "abc"
a, result = a[:-1], a[-1]

这表明您将字符串一分为二。如果您要检查字符串的每个字节,则可以对其进行迭代(如果您愿意,可以反过来):

for result in reversed(a):
    ...

我应该添加这似乎有点做作:您的字符串更有可能有一些分隔符,然后您将使用split

ans = "foo,blah,etc."
for a in ans.split(","):
    ...

【讨论】:

    【解决方案2】:

    这不仅是首选方式,也是唯一合理的方式。因为字符串是不可变的,为了从字符串中“删除”一个字符,你必须在你想要一个不同的字符串值时创建一个新的字符串。

    您可能想知道为什么字符串是不可变的,因为每次更改字符时都必须创建一个全新的字符串。毕竟,C 字符串只是字符数组,因此是可变的,并且一些比 C 更干净地支持字符串的语言也允许可变字符串。拥有不可变字符串有两个原因:安全性/安全性和性能。

    安全性可能是字符串不可变的最重要原因。当字符串是不可变的时,您不能将字符串传递到某个库中,然后在您不期望的情况下让该字符串从您的脚下发生变化。您可能想知道哪个库会更改字符串参数,但如果您将代码发送给客户端,您将无法控制他们的标准库版本,恶意客户端可能会更改他们的标准库以破坏您的程序并了解更多信息关于它的内部结构。不可变对象也更容易推理,当您试图证明您的系统对特定威胁是安全的时,这一点非常重要。这种易于推理对于线程安全尤其重要,因为不可变对象自动是线程安全的。

    不可变字符串的性能通常会更好。每当您获取字符串的一部分时,Python 运行时只会在原始字符串上放置一个视图,因此不会分配新的字符串。由于字符串是不可变的,因此您无需实际复制即可获得复制语义,这是真正的性能优势。

    Eric Lippert 详细解释了字符串不可变背后的基本原理(使用 C#,而不是 Python)here

    【讨论】:

      【解决方案3】:

      问题的准确措辞让我觉得这是不可能的。

      return 对我来说意味着你有一个函数,你已经传递了一个字符串作为参数。

      您无法更改此参数。分配给它只会改变函数内参数的值,而不是传入的字符串。例如

      >>> def removeAndReturnLastCharacter(a):
              c = a[-1]
              a = a[:-1]
              return c
      
      >>> b = "Hello, Gaukler!"
      >>> removeAndReturnLastCharacter(b)
      !
      
      >>> b    # b has not been changed
      Hello, Gaukler!
      

      【讨论】:

        【解决方案4】:

        是的,python 字符串是不可变的,任何修改都会导致创建一个新字符串。这就是它的主要完成方式。

        所以,继续吧。

        【讨论】:

          【解决方案5】:

          我决定使用 for 循环,只是避开有问题的项目,这是一个可以接受的替代方案吗?

          new = ''
          for item in str:
              if item == str[n]:
                  continue
              else:
                  new += item
          

          【讨论】:

            猜你喜欢
            • 2017-08-19
            • 1970-01-01
            • 1970-01-01
            • 2011-01-19
            • 1970-01-01
            • 2013-03-17
            相关资源
            最近更新 更多