【发布时间】:2010-11-12 03:41:49
【问题描述】:
我试图找出python只实例化一次的整数(似乎是-6到256),在这个过程中偶然发现了一些我看不到模式的字符串行为。有时,相等的字符串以不同的方式创建共享相同的 id,有时不共享。这段代码:
A = "10000"
B = "10000"
C = "100" + "00"
D = "%i"%10000
E = str(10000)
F = str(10000)
G = str(100) + "00"
H = "0".join(("10","00"))
for obj in (A,B,C,D,E,F,G,H):
print obj, id(obj), obj is A
打印:
10000 4959776 真 10000 4959776 真 10000 4959776 真 10000 4959776 真 10000 4959456 假 10000 4959488 假 10000 4959520 假 10000 4959680 假我什至没有看到这种模式——除了前四个没有明确的函数调用这一事实——但肯定不可能,因为 C 中的“+”例如暗示add 的函数调用。我特别不明白为什么 C 和 G 不同,因为这意味着加法组件的 ID 比结果更重要。
那么,A-D 经历了怎样的特殊处理,使它们成为同一个实例?
【问题讨论】:
-
你有没有反汇编字节码,看看每一行实际生成了什么?你知道编译时优化是否完成了吗?
-
起初我对此表示怀疑,因为我从解释器那里得到了相同的结果,但我用 dis 尝试了你的建议。我将结果放在另一个答案中(评论框中没有足够的空间),它使正在发生的事情变得可爱而清晰。谢谢!
-
@Markus:永远不要评论你自己的问题。要么更新问题,要么回答它,这就是你所做的。不要为回答你自己的问题而道歉。如果您更新答案以删除“cmets 空间不足”业务,这将有所帮助。
-
@S.Lott:评论你自己的问题有什么问题,尤其是回复别人的评论?在这种特殊情况下,我觉得这个问题是独立的,所以不想改变它。你让我得到了一个很好的答案,所以我发布了。但是,在您的评论中,我的某些评论是专门针对您的。还有什么更好的地方呢?我意识到这个讨论现在已经无可救药地离题了,但我看不出有其他方法。
标签: python string instance uniqueidentifier