我是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在创建新的字符串对象时仅检查“简单”字符串,而不检查长字符串吗?那么太复杂/太长又太复杂/太长了?
答案 0 :(得分:1)
x is y
和x==y
有所不同
x is y
将检查x和y是否指向堆中的同一对象。
x == y
会检查x和y的值是否相同。
如果值的长度很小(最多3到4位),则python检查堆中是否存在另一个具有相同值的对象。如果存在,则不创建新对象,并且如果不存在,它将创建新对象。
如果值的长度为Big(大于4位),则python创建新对象,它不会检查是否存在具有相同值的对象。
在python中,当two variables
分别具有same string,int or float value
和if 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的长度很大时, 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解释器将创建新对象(即使该对象已经存在也是如此)
现在,由于x
和y
引用了不同的对象,因此输出为False
并且由于x
和y
具有相同的值,因此输出为True
例如,您也可以尝试
a = 10000
b = 10000
a is b
False #output
a == b
True #output
Python这样做是为了减少解释时间(即代码的执行时间)
如果python一直检查堆中是否已经存在长字符串(例如,长度为10)。它将需要更多的时间,因为它将逐个字母地与所有对象进行比较。比较10位数字会消耗很多时间。
而如果字符串的长度小于4则很容易比较(因为只需要3个字母即可比较),并且不会花费很多时间。