Python使用'is'似乎与JavaScript'==='类似但不完全相似。
他们在这里讨论确切的实例: http://www.learnpython.org/en/Conditions
这里(对于JS)他们谈论“相同和相同的类型”。 http://www.w3schools.com/js/js_comparisons.asp
你可以有两个不同的(例如)一串“Bob”的实例,当使用'is'进行比较时,它们不会返回true吗?或者它与===相同?
我猜这与严格与非严格类型的语言有关。 。 。
答案 0 :(得分:14)
你可以有两个不同的实例(比方说)一串“鲍勃”和 使用'is'比较时他们不会返回true?或者是事实 与===?
相同
a = "Bob"
b = "{}".format("Bob")
print a, b
print a is b, a == b
<强>输出强>
Bob Bob
False True
注意:在大多数Python实现中,compile time Strings are interned。
另一个例子,
print 3 is 2+1
print 300 is 200+100
<强>输出强>
True
False
这是因为Python中的小整数(-5到256)在内部缓存。因此,无论何时在程序中使用它们,都会使用缓存的整数。因此,is
将为其返回True
。但是如果我们选择更大的数字,就像在第二个例子中那样,(300 is 200+100
)它不是真的,因为它们不是缓存的。
<强>结论:强>
仅当被比较的对象是同一个对象时, is
才会返回True
,这意味着它们指向内存中的相同位置。 (它完全取决于缓存/实习对象的python实现。在这种情况下,is
将返回True
)
经验法则
绝对不要使用is
运算符来检查两个对象是否具有相同的值。
你问题的其他部分是关于===运算符。让我们看看该运算符的工作原理。
引用ECMA 5.1规范,The Strict Equality Comparison Algorithm定义如下
- 如果Type(x)与Type(y)不同,则返回false。
- 如果Type(x)为Undefined,则返回true。
- 如果Type(x)为Null,则返回true。
- 如果Type(x)是Number,那么
- 如果x为NaN,则返回false。
- 如果y为NaN,则返回false。
- 如果x与y的数字值相同,则返回true。
- 如果x为+0且y为-0,则返回true。
- 如果x为-0且y为+0,则返回true。
- 返回false。
- 如果Type(x)是String,则如果x和y恰好是,则返回true 相同的字符序列(相同的长度和相同的字符) 相应的职位);否则,返回false。
- 如果Type(x)是布尔值,如果x和y都为true或两者都返回true 假;否则,返回false。
- 如果x和y引用同一个对象,则返回true。否则,返回 假的。
醇>
我们可以不比较Python的is
运算符和JavaScript的===
运算符,因为Python的is
运算符只执行Strict Equality Comparison算法中的最后一项。
7. Return true if x and y refer to the same object. Otherwise, return false.
答案 1 :(得分:5)
完全不同。
>>> a = 'foo'
>>> b = 'bar'
>>> a + b is 'foobar'
False
>>> 1000 + 1 is 1001
False
答案 2 :(得分:4)
Python的is
关键字比较引用(因此是关于身份)而===
does a minimal amount of coercion(因此关注相等性,至少在基元的情况下),因此它们是不同的。
据我了解,与身份有关的事情与运行时的独特性有关(这两个变量指向内存中的相同地址),而等式与内容的唯一性有关变量(这两个变量是等价的,无论它们相对于彼此放在内存中的哪个位置)。
答案 3 :(得分:3)
>>> a = "Hello, World!!!"
>>> b = "Hello, World!!!"
>>> a is b
False
但请注意:
>>> a = "Bob"
>>> b = "Bob"
>>> a is b
True
在这种情况下,条件为True
,因为编译器可以自由地使用实体字符串文字,因此可以重用相同的对象,并且它可以使用小字符串。但是,如果发生这种情况并且版本和实现之间的行为发生变化,则无法保证何时发生这种情况。
可靠的False
输出应为:
>>> a = 'Hello, World!!!!'[:-1]
>>> b = 'Hello, World!!!!'[:-1]
>>> a is b
False
或任何实际计算字符串的内容。