6

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

a = "hello"
b = "hello"

当我比较两个字符串时

a == b

输出是

True

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

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

所以,我可以安全地假设“每次解释器看到一个已经分配的变量名时,它都会用它所指的对象替换它”?我用谷歌搜索了它,但找不到我正在寻找的任何合适的答案。

4

3 回答 3

17

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

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

如果您想要类似 Java 的等价物==,请使用is运算符:a is b。比较名称是否与a引用相同的对象b,而不管它们是否相等。

于 2012-08-07T02:48:07.710 回答
7

Python实习:

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

短字符串往往会自动停顿,解释了原因a is b == True。请参阅此处了解更多信息。

于 2012-08-07T02:58:40.027 回答
6

To show that equal strings don't always have the same id

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

also:

>>> str([]) == str("[]")
True
>>> str([]) is str("[]")
False
于 2012-08-07T03:35:46.440 回答