Python 'is' vs JavaScript ===

前端 未结 4 1433
一向
一向 2021-02-04 03:01

The Python use of \'is\' seems to be similar to JavaScript \'===\' but not quite.

Here they talk about exact instances: http://www.learnpython.org/en/Conditions

<
相关标签:
4条回答
  • 2021-02-04 03:25
    >>> a = "Hello, World!!!"
    >>> b = "Hello, World!!!"
    >>> a is b
    False
    

    However note that:

    >>> a = "Bob"
    >>> b = "Bob"
    >>> a is b
    True
    

    In this case it condition was True because the compiler is free to intern string literals, and thus reuse the same object, and it does do that with small strings. However there is no guarantee as to when this happens of if this happens at all and the behaviour changes between versions and implementations.


    A realiable False output should be:

    >>> a = 'Hello, World!!!!'[:-1]
    >>> b = 'Hello, World!!!!'[:-1]
    >>> a is b
    False
    

    Or anything that actually computes the strings.

    0 讨论(0)
  • 2021-02-04 03:37

    Python's is keyword compares references (and so is about identity) while === does a minimal amount of coercion (and is therefore concerned with equality, at least in the case of primitives) so they are different.

    As I understand it, things that are concerned with identity are concerned with uniqueness from the runtime's point of view (do these two variables point to the same address in memory) while equality is concerned with the uniqueness of the contents of the variables (are these two variables equivalent, regardless of where they are placed in memory relative to each other).

    0 讨论(0)
  • 2021-02-04 03:44

    Python Part

    SO can you have two different instances of (say) a string of "Bob" and have them not return true when compared using 'is'? Or is it infact the same as ===?

    a = "Bob"
    b = "{}".format("Bob")
    print a, b
    print a is b, a == b
    

    Output

    Bob Bob
    False True
    

    Note: In most of the Python implementations, compile time Strings are interned.

    Another example,

    print 3 is 2+1
    print 300 is 200+100
    

    Output

    True
    False
    

    This is because, small ints (-5 to 256) in Python are cached internally. So, whenever they are used in the programs, the cached integers are used. So, is will return True for them. But if we choose bigger numbers, like in the second example, (300 is 200+100) it is not True, because they are NOT cached.

    Conclusion:

    is will return True only when the objects being compared are the same object, which means they point to the same location in memory. (It solely depends on the python implementation to cache/intern objects. In that case, is will return True)

    Rule of thumb:

    NEVER use is operator to check if two objects have the same value.


    JavaScript Part

    Other part of your question is about === operator. Lets see how that operator works.

    Quoting from ECMA 5.1 Specs, The Strict Equality Comparison Algorithm is defined like this

    1. If Type(x) is different from Type(y), return false.
    2. If Type(x) is Undefined, return true.
    3. If Type(x) is Null, return true.
    4. If Type(x) is Number, then
      1. If x is NaN, return false.
      2. If y is NaN, return false.
      3. If x is the same Number value as y, return true.
      4. If x is +0 and y is −0, return true.
      5. If x is −0 and y is +0, return true.
      6. Return false.
    5. If Type(x) is String, then return true if x and y are exactly the same sequence of characters (same length and same characters in corresponding positions); otherwise, return false.
    6. If Type(x) is Boolean, return true if x and y are both true or both false; otherwise, return false.
    7. Return true if x and y refer to the same object. Otherwise, return false.

    Final Conclusion

    We can NOT compare Python's is operator and JavaScript's === operator, because Python's is operator does only the last item in the Strict Equality Comparison Algorithm.

    7. Return true if x and y refer to the same object. Otherwise, return false.
    
    0 讨论(0)
  • 2021-02-04 03:50

    Completely different.

    >>> a = 'foo'
    >>> b = 'bar'
    >>> a + b is 'foobar'
    False
    >>> 1000 + 1 is 1001
    False
    
    0 讨论(0)
提交回复
热议问题