Python IF参数为true,忽略后面的参数

时间:2013-10-11 23:17:47

标签: python python-3.x

我写了一个如果有效,但忽略它的缩进参数。这是代码:

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

感谢您的帮助。

3 个答案:

答案 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对之外执行任何其他计算也更明智。在这种情况下,如果intValueError无法转换为整数,则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的数字,任何非空字符串,任何非空列表等,它都会评估为真。