0

我写了一个 if that works,但忽略了它的缩进参数。这是代码:

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下的打印呢?

如果我删除 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

谢谢你的帮助。

4

3 回答 3

4

list.index返回索引或引发异常。您正在检查结果是否为True:一个单例对象-整数值永远不会是,因此该if子句永远不会为真。

于 2013-10-11T23:22:24.513 回答
4

is不测试布尔相等性,它测试对象身份。index返回整数,并且没有整数是与布尔常量相同的对象True

如果您只想测试返回值是否在布尔上下文中计算,请使用indexTrue

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可以引发。这会使代码遵循插入大小写,这是错误的。更好的是:ValueErrorvavb

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
于 2013-10-11T23:23:27.197 回答
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:是非常严格的,函数必须 return True。您可以改用if f():它,它将对任何大于 0 的数字、任何非空字符串、任何非空列表等评估为真。

于 2013-10-11T23:32:42.753 回答