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

Python IF argument is true, following arguments ignored

我写了一个if,但忽略了它的缩进参数。代码如下:

1
2
3
4
5
6
7
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)

这是一个叫做:

1
2
3
4
5
class graph:
v = 0
a = 0
ponteiro = []
node = []

没有回溯或错误消息,但如果我打印列表,则不会插入圆弧,因此如果工作了。但为什么在执行期间会完全忽略if下的打印?

如果我删除try/except并继续插入,这就是回溯。

1
2
3
4
5
6
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

谢谢你的帮助。


is不测试布尔相等,它测试对象标识。index返回整数,任何整数都不是与布尔常数True相同的对象。

如果只想在布尔上下文中测试index的返回值是否计算为True,请使用:

1
if grafo.node.index([int(va),int(vb)]):

这仍然存在问题,因为index将为列表的第一个元素返回0,这被认为是False。捕获异常是使用index测试列表成员身份的最佳方法。你根本不需要把它放在if里。注意,如果您不关心值的索引,那么index不是测试列表成员资格的正确工具。但如果你这样做的话,会是这样的:

1
2
3
4
5
6
7
8
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是个坏主意。这将防止您看到严重的错误。如果您只是在值不在列表中时尝试捕获由index方法引发的ValueError,则只捕获该异常:

1
2
except ValueError:
    Beta.criararesta(grafo,va,vb)

当您使用的方法可能会对正常输入合理地抛出异常时,最好在try/except对之外执行任何其他计算。在这种情况下,如果不能将vavb转换为整数,int可以提高ValueError。这将使代码跟随插入的情况,这是错误的。最好是:

1
2
3
4
5
6
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,除非您实际需要列表索引,在这个代码片段中,您不需要:

1
2
3
4
5
if [int(va),int(vb)] in grafo.node:
    print("Arco já existe")
else:
    Beta.criararesta(grafo,va,vb)
    print grafo.node


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


似乎grafo.node.index函数没有返回true。根据您的代码,我的最佳猜测是,如果某个数组中存在数字,它会返回该数组的索引,否则会引发异常(这就是您编写except的原因吗?).

请尝试以下代码以了解您的if不输入的原因:

1
2
3
4
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的数字、任何非空字符串、任何非空列表等计算为真。