为什么比较#1和比较#2有不同的评估结果?
list = [{'objItem':{'key':'exists', 'a':'aaa', 'b':'bbb', 'c':'ccc', 'd':'ddd'}}]
valA = "aaa"
valB = "bbb"
valC = "ccc"
#Comaprisson 1
if valC in list[0]['objItem'].itervalues() and valA in list[0]['objItem'].itervalues() and valB in list[0]['objItem'].itervalues():
print "True #1"
else:
print "False #1"
#Comparisson 2
values = list[0]['objItem'].itervalues()
if valC in values and valA in values and valB in values:
print "True #2"
else:
print "False #2"
结果:
$python main.py
True #1
False #2
谢谢
答案 0 :(得分:1)
当itervalues()
返回一个迭代器时,在比较期间它将通过迭代器运行,直到它找到值或熄灭迭代器。在您的情况下,您检查了valC
这是迭代器中可用的最后一个值,因此当它检查比较中的下一个值valB
时,没有什么可以检查的。相反,如果你写了if valA in values and valB in values and valC in values:
,那么将返回一个真值。
答案 1 :(得分:1)
Itervalues(在python-reference上看到)给出了一个迭代器,而不是一个map的值列表。 如果使用python 3,获取值集合的正确方法将是values()ref 对于python 2, 正确的方法是将它作为列表(list [0] ['objItem']。itervalues())按照这个例子。
至于为什么两人会得出不同的结果:
正如前面提到的用户0TTT0,
使用values方法时,迭代器会耗尽其值
但如果你试过
列表[0] ['objItem']中的valC。itervalues()
在您的代码段后,它将返回true 这是因为list [0] ['objItem']。itervalues()每次都返回一个新的迭代器对象。但另一方面,值有一个存储的迭代器对象 所以:值中的valC将使用values运算符中的“ccc”,而使用list [0] ['objItem']中的valC.itervalues()每次都会使用新的迭代器“ccc”!
旁注:
我建议使用list作为变量。
1.因为命名变量与对象类型相同是不好的做法
你可以把它命名为更具描述性和复数的东西