【问题标题】:Does Python += operator make string mutable?Python += 运算符是否使字符串可变?
【发布时间】:2018-06-18 18:43:47
【问题描述】:

当我尝试使用 += 运算符修改字符串,并使用 id() 方法检查对象的身份时,字符串似乎是可变的。有人遇到过这种怪异的蟒蛇行为吗?

a = '123'

print id(a)
# 89806008

a += '1'

print id(a)
# 89245728

a += '1'

print id(a)
# 89245728

print a

# '12311'

使用a = a + '1'效果不一样,换个字符串id吧。

【问题讨论】:

  • @Tai 这个问题是关于字符串变量的一般重新绑定。这里是关于新对象具有相同的内存地址,表明它是同一个对象。
  • @schwobaseggl 知道了。
  • 也许stackoverflow.com/questions/24245324/… 对这个问题有解释?
  • 可能解释器检测到“1231”不再使用,并将“12311”放在同一内存位置

标签: python string python-2.7 mutability


【解决方案1】:

如果你对这个字符串是可变的是正确的,那么添加

b = a

在您的第二个 a += '1' 之前不应对您的输出产生任何影响。但确实如此。

原因是因为在“increment”之前的字符串a不再在任何地方使用,id可以被重用。但是通过将该字符串分配给b,它现在在某处使用,而a 的新字符串不能重复使用该ID。

【讨论】:

  • 明确地说,这是一个 CPython 特定的优化(它只在引用计数的解释器中可靠地工作)。根据PEP8's programming recommendations,您不应该依赖它:“例如,对于a += ba = a + b 形式的语句,不要依赖CPython 对就地字符串连接的有效实现。这种优化甚至是脆弱的在 CPython 中(它只适用于某些类型)并且根本不存在于不使用引用计数的实现中。”
猜你喜欢
  • 2017-05-06
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 2022-06-28
相关资源
最近更新 更多