在JavaScript中,有严格的比较操作符op1 === op2和op1 !== op2将比较这两个类型和值.有没有一种pythonic方式来实现同样的事情?
到目前为止,我只能提出以下凌乱的条件:
isinstance(op1, type(op2)) and isinstance(op2, type(op1)) and op1 == op2
Run Code Online (Sandbox Code Playgroud)
和
not isinstance(op1, type(op2)) or not isinstance(op2, type(op1)) or op1 != op2
Run Code Online (Sandbox Code Playgroud)
Sim*_*ser 10
您的方法确实会检查值和类型.Python中没有不同的运算符.
这已经说过,在很多情况下并不是你想要的 - 在Python的哲学中,任何表现为鸭子的对象都应该被视为鸭子.您通常不希望只使用字典,您想要"类似映射"的对象等 - 只要该对象可用于特定任务,那么代码就应该接受它.
Python的相等比较器是严格的,除了将1与True,0与False进行比较时,如果1或0的值是float,decimal.Decimal或long类型则无关紧要.任何数字类型的零,例如,0,0L,0.0,0j始终为False.(注意,强制转换为bool的其他任何东西都是True.请参阅Python中的真值测试.)除复杂(1L,1.0,1)之外的任何类型的1都是True.
在Python中:
0 == '0' # False
0 == '0' and type(0) == type('0') # False, compare short circuits
0 == '' # False
0 == '' and type(0) == type('') # False, compare short circuits
1 == True and type(1) == type(True) # False, makes a difference here
1 == True # True, also true if 1 was 1.00, etc..
0 == False # True
False == None # False
0 == bool(None) # True
Run Code Online (Sandbox Code Playgroud)
当第一个比较返回False时,第二个比较不被评估,因此它短路,因为0和其他任何东西都是0.这是不必要的,但它只适用于在第6行比较1和True时.
在JavaScript中:
0 == '0' //true
0 === '0' //false
0 == '' //true
0 === '0' //false
1 === true //false
1 == true //true
0 == false //true
false == null //false
0 == !!(null) //true
Run Code Online (Sandbox Code Playgroud)
所以===Python中最接近JavaScript 的是:
a == b and type(a) == type(b)
Run Code Online (Sandbox Code Playgroud)
但是只需要在布尔比较为1或0的情况下使用,这是不太可能的.如果您希望某个值是数字或布尔值,则可能需要修复代码.一个菜鸟的错误就是会发生这样的事情:
a = 0.0 # a valid value, lets assume it comes from a source that can also return None and we have no control over that.
# Should be:
# if a not None:
if a: # a is cast to bool, bool(0.0) is False
print "do something here..."
Run Code Online (Sandbox Code Playgroud)
为了解决一些困惑,要了解Python的好处是运营商.Python有一个is运算符,如果is的两边绑定到同一个对象,则返回True,否则返回False.使用字符串文字时,对象的生命周期仅适用于语句的实例.因此,对字符串文字执行是安全的,因为如果它们相同,则将它们分配给同一对象.这也适用于其他不可变类型,如bool和所有数字类型:
0 is '0' # False
0 is False # False
0 is 0 # True
Run Code Online (Sandbox Code Playgroud)
在比较两个变量或变量和文字时,无法保证这一点.
当您创建两个空列表时,您将获得两个不同的对象,因此返回False:
x = []
y = []
x is y # False
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,这些变量引用相同的列表,并将继续这样做,直到它们被重新分配,或者深层复制一个来自另一个:
x = y = []
x is y # True
x.append(1)
x is y # True
x = [1, ]
x is y # False, even though the value is same
Run Code Online (Sandbox Code Playgroud)
该IS操作是比较对象的身份,它正在执行以下事项:
id('0') == id(0)
Run Code Online (Sandbox Code Playgroud)
因此,如果两个对象都引用相同的内存,则它们引用相同的对象,因此必须相同.
它是一个好主意,以避免是,除非你要检查,如果两个对象引用相同的内存,以使严格的比较.
正如Simon的回答所说,Python的平等哲学与JavaScript不同,并且确实不需要严格的相等比较器.Python的相等比较器不像JavaScripts那样松散,==但同时它与它不完全相同===.
你应该对Python的相等比较器没问题,只要它清楚你任何数字类型的零(0,0L,0.0,0j)总是等于False和任何数字类型的1除了复数(1,1L,1.0) ) 是真的.
Python 的相等比较器在大多数情况下总是严格的。
例如:
Python
0 == '0' # False
0 == '' # False
Run Code Online (Sandbox Code Playgroud)
Javascript
0 == '0' //True
0 === '0' //False
0 == '' //True
0 === '0' //False
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12255 次 |
| 最近记录: |