我写了一个如果有效,但忽略它的缩进参数。这是代码:
else:
try:
if grafo.node.index([int(va),int(vb)]) is True:
print("Arco já existe")
except:
Beta.criararesta(grafo,va,vb)
print(grafo.node)
这是一个名为:
的类class graph:
v = 0
a = 0
ponteiro = []
node = []
没有回溯或错误消息,但是如果我打印列表,则不插入弧,因此if if working。但是为什么执行期间完全忽略if下的打印?
如果我删除了try / except并继续插入,这是回溯。
Traceback (most recent call last):
File "C:/Python33/Archive/PythonGrafos/Alpha.py", line 96, in <module>
menugrafos()
File "C:/Python33/Archive/PythonGrafos/Alpha.py", line 56, in menugrafos
if grafo.node.index([int(va),int(vb)]):
ValueError: [0, 1] is not in list
感谢您的帮助。
答案 0 :(得分:4)
list.index
要么返回索引,要么引发异常。你正在检查结果是否是True
:一个单例对象 - 一个整数值永远不会是,所以if
子句永远不会成立。
答案 1 :(得分:4)
is
不测试布尔相等性,它测试对象标识。 index
返回整数,并且没有整数是与布尔常量True
相同的对象。
如果您只想测试index
的返回值是否在布尔上下文中求值为True
,请使用:
if grafo.node.index([int(va),int(vb)]):
这仍有问题,因为index
将为列表的第一个元素返回0,并且这被视为False
。捕获异常是使用index
测试列表成员资格的最佳方法。您根本不需要将它放在if
中。请注意,如果您不关心值的索引,index
不是测试列表成员身份的正确工具。但是如果你这样做会是这样:
try:
i = grafo.node.index([int(va), int(vb)])
except ValueError:
Beta.criararesta(grafo,va,vb)
print grafo.node
# maybe assign i to something useful here, or None, depending on what you're doing with it
else:
print("Arco já existe")
另外,毯子except
是一个坏主意。那会阻止你看到严重的错误。如果您只是尝试捕获ValueError
方法引发的index
,当值不在列表中时,只捕获该异常:
except ValueError:
Beta.criararesta(grafo,va,vb)
当您使用可能在正常输入上合理抛出异常的方法时,在try/except
对之外执行任何其他计算也更明智。在这种情况下,如果int
或ValueError
无法转换为整数,则va
可以提升vb
。这将使代码遵循插入案例,这是错误的。更好的是:
iva = int(va)
ivb = int(vb)
try:
i = grafo.node.index([iva, ivb])
except ValueError:
Beta.criararesta(grafo, va, vb) # or possibly (grafo, iva, ivb), depends on the implementation
最后,您应该使用in
运算符而不是index
,除非您确实需要列表索引,在此代码段中您不需要:
if [int(va),int(vb)] in grafo.node:
print("Arco já existe")
else:
Beta.criararesta(grafo,va,vb)
print grafo.node
答案 2 :(得分:0)
似乎grafo.node.index
函数没有返回True。根据你的代码,我最好的猜测是,如果数字中存在数字,它会返回某个数组的索引,否则会引发异常(这就是为什么你写了except
?)。
请尝试使用以下代码来了解if
未输入的原因:
if grafo.node.index([int(va),int(vb)]) is True:
print("Arco já existe")
else:
print("Didn't enter if, got {}".format(grafo.node.index([int(va),int(vb)])))
另外,请注意if f() is True:
非常严格,函数必须返回True
。您可以改为使用if f():
,对于任何高于0的数字,任何非空字符串,任何非空列表等,它都会评估为真。