Python对象引用

7
我知道在Python中每个标识符或变量名都是对实际对象的引用。
a = "hello"
b = "hello"

当我比较这两个字符串时

a == b

输出结果为:

True

如果我用Java写等价代码,输出将是“false”,因为比较的是引用(它们不同),而不是实际对象。
所以我在这里看到的是变量名在运行时由解释器替换为实际对象。
那么,我能否安全地假设“每次解释器看到已分配的变量名时,都会用其所引用的对象替换它”?我尝试了谷歌,但没有找到我想要的适当答案。

2
对于“每次解释器看到已经分配的变量名,它就会用它所引用的对象替换它”的说法。实际上,每个现有的Python变量都被分配了一个引用。将引用视为真实对象的地址。在任何语言中,除了赋值之外,对变量的任何使用都意味着使用其内容。内容是引用值。在许多语言中,引用值会自动取消引用,然后看起来就像直接使用目标对象一样。 - pepr
3个回答

17

如果你在Java中运行它,我认为你会发现它可能会因为字符串插入而打印出true,但那有点不相关。

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

如果你想要类似于Java的==的等效操作符,请使用is运算符:a is b。无论它们是否相等,它都比较名称a和名称b是否引用同一个对象。


3
除非:a = "test"; b = "test"; a is b == True - Hamish
5
再次提到,这是由于字符串池的缘故。如果你将字符串作为输入,例如 a = raw_input(); b = raw_input() 并且两次都键入 "test",那么 a is b 的值将会是 False - Danica
是的,只需要说一下,为了清晰明了。 - Hamish
1
无论它们是否相等,值得注意的是(侧面提到)a is b通常意味着a == b(尽管有可能某些东西与其自身比较不相等)。 - lvc

9

Python内部化:

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

短字符串往往会自动合并,这就解释了为什么a is b == True。更多信息请参见此处


4
除非您使用 intern 函数,否则实习不是保证的。 - Mark Ransom

6
展示相等的字符串并不总是具有相同的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接