varA = 1
varB = 2
具有正确结果的代码:
if type(varA) == type('a') or type(varB) == type('a'):
print "string involved (either varA or varB is a string)"
else:
print "varA and varB are not strings"
代码w /不正确的结果:
if type(varA) or type(varB) == type('a'):
print "string involved (either varA or varB is a string)"
else:
print "varA and varB are not strings"
为什么第二组代码没有返回预期结果(即“varA和varB不是字符串”)? Python使用第二组代码执行的操作的逐步细分是什么?我发现一个类似的问题已经得到解答,但并没有完全理解这个解释。 Python: If-else statements
答案 0 :(得分:3)
在第二个代码片段中,Python正在解释if语句的条件,如下所示:
if (type(varA)) or (type(varB) == type('a')):
此外,总是评估为True
。
这是因为,无论varA
的价值是什么,type(varA)
评估为True
:
>>> varA = 'a'
>>> bool(type(varA))
True
>>> varA = False
>>> bool(type(varA))
True
>>>
事实上,由于Python的逻辑运算符短路(尽快停止评估),条件的type(varB) == type('a')
部分将永远不会被评估。
另外,您应该使用is
来比较类型:
if type(varA) is str or type(varB) is str:
或者,您可以使用isinstance
:
if isinstance(varA, str) or isinstance(varB, str):
答案 1 :(得分:1)
你的第二个例子不起作用,因为它解析为
if (type(varA)) or (type(varB) == type('a')):
和type(varA)
将始终是一个被视为True
的类类型,因此整个表达式将为True
有更好的方法可以做到这一点
if any(isinstance(v, str) for v in (varA, varB)):
如果iterable中的任何内容为true, any
将获取一个iterable并计算为True
。
isinstance
检查第一个参数“是否是”第二个参数。将生成器表达式放在任何读取内部“如果任何v in(varA,varB)是一个字符串):...”
>>> var = 1
>>> isinstance(var, str) # var is an int, not a str
False
>>> isinstance(var, int)
True
>>> isinstance('a', int)
False
>>> isinstance('a', str) # 'a' is a str
True
答案 2 :(得分:0)
iCodez是绝对正确的,但是如果你真的想要按照“列出所有元素并检查其中一个是否为字符串”的方式做一些事情:
if str in map(type, [varA, varB]):
print "string involved"
答案 3 :(得分:-1)
因为在第二种情况下,您没有比较两个变量。任何大于0的整数都将返回True,因此您不会在此处比较类型。
if type(varA):
将始终为True,因为varA等于1.您甚至不会达到条件的第二部分。