名称的Python id和'​​__main__'不同

Kar*_*and 3 python

通常,如果我为变量分配一些值,然后检查它们的ID,我希望它们是相同的,因为python实际上只是给我的对象一个"名称".这可以在下面的代码中看到:

>>> a = 3
>>> id(a)
19845928
>>> id(3)
19845928
Run Code Online (Sandbox Code Playgroud)

问题是当我用" 名字 " 执行相同的操作时

>>> __name__
'__main__'
>>> id(__name__)
19652416
>>> id('__main__')
19652448
Run Code Online (Sandbox Code Playgroud)

那些ID怎么会有所不同,它们不应该是一样的吗?因为__name__也应该只是一个参考.

buk*_*zor 5

id()基本上给出了数据的内存指针.虽然字符串是不可变的,但不保证它们是实例化的.这意味着一些具有相同值的字符串具有不同的指针.

对于整数(特别是小整数),指针将是相同的,所以你的3例子工作正常.


@KartikAnand:你检查"同一个对象"的方式是有效的,尽管通常的方法是使用x is y.问题是它们不是同一个对象,并不能保证.它们只是具有相同的价值.请注意,当您"__main__"创建新对象时.有时,Python做一个很好的优化和重新使用相同的值的先前创建的字符串,但它不具备对.


Kartik的目标是"验证赋值是否以某种方式引用,而对象不是即时创建的".为此,请避免创建新对象(无字符串文字).

>>> __name__
'__main__'
>>> x = __name__
>>> id(__name__)
3078339808L
>>> id(x)
3078339808L
>>> __name__ is x
True
Run Code Online (Sandbox Code Playgroud)

  • @NoctisSkytower:请注意,这是id()的实现细节,并且对于替代解释器或可能的未来版本的python是不同的. (2认同)