Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python对象引用_Python_Python 3.x_Python 2.7 - Fatal编程技术网

Python对象引用

Python对象引用,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,我知道在python中,每个标识符或变量名都是对实际对象的引用 a = "hello" b = "hello" 当我比较两个字符串时 a == b 输出是 True 如果我用Java编写一个等价的代码,输出将是false,因为比较是在引用(不同的引用)之间进行的,而不是在实际对象之间 所以我在这里看到的是,解释器在运行时将引用(变量名)替换为实际对象 因此,我可以安全地假设“每次解释器看到一个已经分配的变量名时,它都会用它所引用的对象替换它”?我在谷歌上搜索了它,但找不到我想要的任何合适的

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

a = "hello"
b = "hello"
当我比较两个字符串时

a == b
输出是

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

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


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

如果你真的在Java中运行它,我想你会发现它可能打印出来是真的,因为字符串的内部处理,但这有点不相关

我不知道你所说的“用它所指的对象替换它”是什么意思。实际发生的情况是,当您编写
a==b
时,Python,这就像对
a
调用
b
作为参数一样


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

Python interning:

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

短字符串往往会自动插入,这解释了为什么
a是b==True
。有关更多信息,请参阅。

以说明相等的字符串并不总是具有相同的id

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


除了:
a=“测试”;b=“测试”;a是b==True
@Hamish,因为字符串被插入。如果获取字符串作为输入,例如
a=raw_input();b=raw_input()
和键入“test”两次,
a是b
将是
False
。是的,为了清楚起见,只需要说一句。“不管它们比较是否相等”-值得注意的是,
a是b
通常意味着
a==b
(尽管某些变量完全有可能与其自身不相等)。除非使用
intern
函数,否则不能保证使用intern。对于“每次解释器看到已分配的变量名时,它都会将其替换为它所引用的对象”。实际上,每个现有Python变量都被分配了一个引用。将引用视为实际对象的地址。在每种语言中,变量的任何用法(分配除外)其定义与内容的用法相同。内容是参考值。在许多语言中,参考值通常会自动取消引用,然后看起来就像是直接使用目标对象。
>>> str([]) == str("[]")
True
>>> str([]) is str("[]")
False