Python对象引用

时间:2012-08-07 02:44:15

标签: python python-3.x python-2.7

我知道在python中,每个标识符或变量名都是对实际对象的引用。

a = "hello"
b = "hello"

当我比较两个字符串时

a == b

输出

True

如果我用Java编写等效代码,输出将为false,因为比较是在引用(不同)之间进行的,而不是实际对象。

所以我在这里看到的是,解释器在运行时将引用(变量名称)替换为实际对象。

因此,我可以安全地假设"每次解释器看到已经分配的变量名称时,它都会将其替换为它所指的对象" ?我用谷歌搜索了它,但无法找到我正在寻找的任何合适的答案。

3 个答案:

答案 0 :(得分:15)

如果你真的在Java中运行它,我认为你会发现它可能因为字符串实习而打印出来,但这有点无关紧要。

我不确定你的意思是“将它替换为它所指的对象”。实际发生的是,当您编写a == b,Python calls a.__eq__(b)时,就像使用a作为参数的b上的任何其他方法调用一样。

如果您想要类似于Java的==,请使用is运算符:a is b。这比较了名称a是否与b引用相同的对象,无论它们是否相等。

答案 1 :(得分:5)

Python实习:

>>> a = "hello"
>>> b = "hello"
>>> c = "world"
>>> id(a)
4299882336
>>> id(b)
4299882336
>>> id(c)
4299882384

短字符串往往会自动被中断,解释为什么a is b == True。有关详情,请参阅here

答案 2 :(得分:3)

显示相等的字符串并不总是具有相同的ID

>>> a = "hello"+" world"
>>> b = "hello world"
>>> c = a
>>> a == b
True
>>> a is b
False
>>> b is c
False
>>> a is c
True

也:

>>> str([]) == str("[]")
True
>>> str([]) is str("[]")
False