我知道在python中,每个标识符或变量名都是对实际对象的引用。
a = "hello"
b = "hello"
当我比较两个字符串时
a == b
输出
True
如果我用Java编写等效代码,输出将为false
,因为比较是在引用(不同)之间进行的,而不是实际对象。
所以我在这里看到的是,解释器在运行时将引用(变量名称)替换为实际对象。
因此,我可以安全地假设"每次解释器看到已经分配的变量名称时,它都会将其替换为它所指的对象" ?我用谷歌搜索了它,但无法找到我正在寻找的任何合适的答案。
答案 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