Python如何知道两个字符串变量指向同一对象?

时间:2018-07-06 17:44:42

标签: python object variable-assignment

我是Python的新手,我不得不说Python处理变量赋值和函数参数的方式非常令人困惑。这是我不明白的事情。如果我定义了两个内容明确相同的字符串,例如“ abc”,则它们实际上是同一对象,如下所示。

x = 'abc'
y = 'abc'
x is y
True

这让我开始思考Python如何知道它们是相同的。通过比较代码中的文字?如果在x ='abc'和y ='abc'之间发生了一百万种不同的事情,Python是否会一直返回并说已经有一个对象'abc',所以我将不创建新的'abc'吗?

我想知道如果我做同样的事情但字符串很长又很复杂会怎样?这就是发生的事情。

x = 'nao;uh gahasjhd;fjkhag;sjdgfuiwgfashksghdfaihghehwq3473fsd_@'
y = 'nao;uh gahasjhd;fjkhag;sjdgfuiwgfashksghdfaihghehwq3473fsd_@'
x is y
False
x == y
True

现在您可以看到为什么我感到困惑了。因此,Python在创建新的字符串对象时仅检查“简单”字符串,而不检查长字符串吗?那么太复杂/太长又太复杂/太长了?

1 个答案:

答案 0 :(得分:1)

x is yx==y有所不同
x is y将检查x和y是否指向堆中的同一对象。
x == y会检查x和y的值是否相同。

现在让我们看看为什么得到两个不同的结果

如果值的长度很小(最多3到4位),则python检查堆中是否存在另一个具有相同值的对象。如果存在,则不创建新对象,并且如果不存在,它将创建新对象。
如果值的长度为Big(大于4位),则python创建新对象,它不会检查是否存在具有相同值的对象。

当字符串,int,浮点的长度较小时

在python中,当two variables分别具有same string,int or float valueif the length of value is small时,两个变量都指向同一对象,即,在堆内存中仅创建了一个对象。 br /> 让我们通过这个例子自己尝试。

a=10
b=10
a is b
True     #output
a == b
True     #output  

这里a is b检查a和b是否引用(即指向)堆中的同一对象。
由于 10的长度为2,这很短,因此python解释器只会创建一次对象值10,因此a和b会引用同一对象,而output is True

然后a == b将检查a的值是否等于b的值。
由于a的值为10,b的值为10,所以output is True

您也可以尝试使用字符串值,例如

s1='abc'
s2='abc'
s1 is s2
True      #output
s1 == s2
True      #output  

当string,int,float的长度很大时

现在,当string,int,float的长度很大时, python解释器不会检查堆中是否存在具有相同值的对象,即使存在存在具有相同值的对象,它也会直接创建新对象 >

x = 'nao;uh gahasjhd;fjkhag;sjdgfuiwgfashksghdfaihghehwq3473fsd_@'
y = 'nao;uh gahasjhd;fjkhag;sjdgfuiwgfashksghdfaihghehwq3473fsd_@'
x is y
False
x == y
True

在这里,由于nao;uh gahasjhd;fjkhag;sjdgfuiwgfashksghdfaihghehwq3473fsd_@太长,python解释器将不会检查堆中是否存在另一个具有相同值的对象,它将创建一个对象,而x将引用该对象。
现在再次将nao;uh gahasjhd;fjkhag;sjdgfuiwgfashksghdfaihghehwq3473fsd_@分配给y,但是由于字符串的长度很大,因此python解释器将创建新对象(即使该对象已经存在也是如此)
现在,由于xy引用了不同的对象,因此输出为False
并且由于xy具有相同的值,因此输出为True

例如,您也可以尝试

a = 10000
b = 10000
a is b
False      #output
a == b
True      #output  

为什么Python这么做

Python这样做是为了减少解释时间(即代码的执行时间) 如果python一直检查堆中是否已经存在长字符串(例如,长度为10)。它将需要更多的时间,因为它将逐个字母地与所有对象进行比较。比较10位数字会消耗很多时间。
而如果字符串的长度小于4则很容易比较(因为只需要3个字母即可比较),并且不会花费很多时间。