2013-07-10 69 views
3

当我阅读“学习Python”时,我对使用is运算符感到困惑。是Python中的关键字

本书试图将其解释为对同一存储器地址(A is B,如果True,意味着A和B在相同的存储器地址中)的测试,但在下面的情况下,该解释似乎不成立。谁能帮我理解这个功能?

s2='ufysdjkhflakjhsdjkfhasdhfoqwhefuhalskdjfhwuioehfjkasdhfljahsdjwade' 
    s1='ufysdjkhflakjhsdjkfhasdhfoqwhefuhalskdjfhwuioehfjkasdhfljahsdjwade' 
    s1==s2,s1 is s2 
    (True, True) 

    s1='flashmanfdsafsdfasdfsdffgj;djg;alkjdfgl;kajdfl;gjkla;dfjg;lakdfj;' 
    s2='flashmanfdsafsdfasdfsdffgj;djg;alkjdfgl;kajdfl;gjkla;dfjg;lakdfj;' 
    s1==s2,s1 is s2 
    (True, False) 

    s2='ufysdjkhflakjhsdjkfhasdhfoqwhefuhalskdjfhwuioehfjkasdhfljahsdjwade' 
    s1='ufysdjkhflakjhsdjkfhasdhfoqwhefuhalskdjfhwuioehfjkasdhfljahsdjwade' 
    s1==s2,s1 is s2 
    (True, True) 

    s1=';;' 
    s2=';;' 
    s1==s2,s1 is s2 
    (True, False) 

PS:字符串在内存中存在什么样的格式?

+5

Python尽量避免在可能和实际的情况下创建新的字符串对象。字符串是不可变的,所以相同的*值*可能是同一个对象,节省内存和CPU时间来分配额外的内存。 –

回答

4

这是CPython(标准Python解释器)的实现细节,它将在内存中为一些不可变类型(如字符串和整数)重用相同的数据。您不能依赖这种行为,因此您应始终使用==来比较这些类型。

为了更深入的回答,请参阅https://stackoverflow.com/a/15541556/1544347

1

为基准进行比较,“==”是对“EQ”梅索德语法糖。

因此,当您使用“==”进行测试时,两个字符串的值必须等于true。 如果使用“is”进行测试,则对象必须具有相同的引用。