Python'是'vs JavaScript ===

R C*_*ven 15 javascript python

Python使用'is'似乎与JavaScript'==='类似,但并不完全相同.

在这里,他们谈论确切的实例:http: //www.learnpython.org/en/Conditions

在这里(对于JS),他们谈论"相同和相同的类型". http://www.w3schools.com/js/js_comparisons.asp

你可以有两个不同的(例如)一串"Bob"的实例,当使用'is'进行比较时,它们不会返回true吗?或者它与===相同?

我猜这与严格与非严格类型的语言有关....

the*_*eye 16

Python部分

你可以有两个不同的(例如)一串"Bob"的实例,当使用'is'进行比较时,它们不会返回true吗?或者它与===相同?

a = "Bob"
b = "{}".format("Bob")
print a, b
print a is b, a == b
Run Code Online (Sandbox Code Playgroud)

产量

Bob Bob
False True
Run Code Online (Sandbox Code Playgroud)

注意:在大多数Python实现中,编译时字符串都是实例化的.

另一个例子,

print 3 is 2+1
print 300 is 200+100
Run Code Online (Sandbox Code Playgroud)

产量

True
False
Run Code Online (Sandbox Code Playgroud)

这是因为Python中的小整数(-5到256)在内部缓存.因此,无论何时在程序中使用它们,都会使用缓存的整数.所以,is将为True他们返回.但是如果我们选择更大的数字,就像在第二个例子中那样,(300 is 200+100)它不是真的,因为它们不是缓存的.

结论:

isTrue仅当被比较的对象是同一对象时才会返回,这意味着它们指向内存中的相同位置.(它完全取决于缓存/实习对象的python实现.在这种情况下,is将返回True)

经验法则:

切勿使用is运算符检查两个对象是否具有相同的值.


JavaScript部分

你的问题的其他部分是关于===运算符.让我们看看该运算符的工作原理.

引用ECMA 5.1规范,严格的等式比较算法就是这样定义的

  1. 如果Type(x)与Type(y)不同,则返回false.
  2. 如果Type(x)是Undefined,则返回true.
  3. 如果Type(x)为Null,则返回true.
  4. 如果Type(x)是Number,那么
    1. 如果x是NaN,则返回false.
    2. 如果y是NaN,则返回false.
    3. 如果x与y的Number值相同,则返回true.
    4. 如果x是+0且y是-0,则返回true.
    5. 如果x是-0且y是+0,则返回true.
    6. 返回false.
  5. 如果Type(x)是String,则如果x和y完全相同的字符序列(相应位置的长度和字符相同),则返回true; 否则,返回false.
  6. 如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true; 否则,返回false.
  7. 如果x和y引用同一个对象,则返回true.否则,返回false.

定论

我们可以比较Python的is运营商和JavaScript的===运营商,因为Python的is运营商确实只有在完全平等比较算法的最后一个项目.

7. Return true if x and y refer to the same object. Otherwise, return false.
Run Code Online (Sandbox Code Playgroud)


Bak*_*riu 5

>>> a = "Hello, World!!!"
>>> b = "Hello, World!!!"
>>> a is b
False
Run Code Online (Sandbox Code Playgroud)

但请注意:

>>> a = "Bob"
>>> b = "Bob"
>>> a is b
True
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它的条件是True因为编译器可以自由地实习字符串文字,从而重用相同的对象,并且它确实对小字符串执行此操作。但是,无法保证这种情况何时发生、是否真的发生以及版本和实现之间的行为发生变化。


一个可靠的False输出应该是:

>>> a = 'Hello, World!!!!'[:-1]
>>> b = 'Hello, World!!!!'[:-1]
>>> a is b
False
Run Code Online (Sandbox Code Playgroud)

或者任何实际计算字符串的东西。


Ign*_*ams 5

完全不同.

>>> a = 'foo'
>>> b = 'bar'
>>> a + b is 'foobar'
False
>>> 1000 + 1 is 1001
False
Run Code Online (Sandbox Code Playgroud)


Sea*_*ira 5

Python的is关键字比较引用(关于身份),同时===进行最小量的强制(因此至少在基元情况下与相等有关),因此它们是不同的。

据我了解,从运行时的角度来看,与身份相关的问题与唯一性有关(这两个变量是否指向内存中的同一地址),而平等则与变量内容的唯一性有关(这些是两个变量相等,无论它们在内存中的相对位置如何)。