【问题标题】:why doesn't python rereference this existing object? [duplicate]为什么 python 不重新引用这个现有对象? [复制]
【发布时间】:2013-05-16 03:14:17
【问题描述】:

当我在 Python 中声明一个变量时,它引用了一个对象。在这种情况下,我的对象是字符串“test”。当我将它与“ing123”连接时,变量 a 现在指向字符串对象“testing123”。但是,“testing123”的引用计数并没有增加。为什么会这样?我认为 python 会简单地重新引用以前存在的 'testing123' 字符串对象。在这种情况下,它似乎正在创建另一个 getrefcount 无法识别的对象。我想我的问题是....为什么会发生这种情况?我期待对 getrefcount 的第二次调用返回 5 而不是 4。

from sys import getrefcount

b = 'testing123'
print getrefcount('testing123')
a = 'test'
a += 'ing123'
print getrefcount('testing123')
print a

打印...

4
4
testing123

【问题讨论】:

  • 为什么解释器会浪费时间尝试检测 computed 字符串已经存在?
  • @CristianCiupitu 我不知道。这就是我问的原因。如果您能详细说明您的评论,我将不胜感激。
  • @Dave 感谢您的链接。那里的最佳答案似乎将其归结为“何时缓存和重用字符串的细节取决于实现,可以从 Python 版本更改为 Python 版本并且不能依赖”所以似乎并不总是引用现有对象.
  • @nater:没什么好详细说明的,我只是想强调一个不会发生的可能原因。

标签: python


【解决方案1】:

intern 获取你想要的行为的字符串:

>>> b = intern('testing123')
>>> getrefcount(b)
2
>>> a = 'test'
>>> a = intern(a+'ing123')
>>> getrefcount(b)
3
>>> a is b
True

【讨论】:

  • 并没有真正回答这个问题(“为什么 python 这样做”),但仍然很有用。 +1
  • 这里有一些关于原因的想法:stackoverflow.com/a/2124011/222914
  • @JanneKarila 感谢您的链接。这很好地解释了为什么会发生这种情况。我认为这就是 CristianCiupitu 所说的,如果 python 每次都尝试在内存中查找计算字符串,运行时速度会受到影响。
  • 你发布的链接回答了我的问题,所以我会给你正确的答案。
【解决方案2】:

不建议这样做。

为此使用字典,它更安全。

试试这个

dict = { 'testing123' : 4 }
a = 'test'
a += 'ing123'
print dict[a]

【讨论】:

  • 你错过了这个问题的重点;另外,不建议重新定义dict
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 2017-02-07
  • 2015-06-18
  • 1970-01-01
  • 2013-07-04
  • 2020-05-03
相关资源
最近更新 更多