0

私はそれが機能する場合を書きましたが、インデントされた引数を無視します。コードは次のとおりです。

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 の下の出力が完全に無視されるのはなぜですか?

これは、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

の戻り値がブール値のコンテキストでindex評価されるかどうかをテストするだけの場合は、次を使用します。True

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

indexリストの最初の要素に対して 0 が返され、それが と見なされるため、これにはまだ問題がありFalseます。例外をキャッチすることは、indexリスト メンバーシップをテストするために使用する最良の方法です。入れる必要は全くありませんifindex値のインデックスを気にしない場合、リストのメンバーシップをテストするための適切なツールではないことに注意してください。しかし、これを実行すると、次のようになります。

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 に答える