3

リストのリストが有効な数独パズルになるかどうかをチェックするこの関数を書いています。有効な整数のリストをチェックしているときに、予期しない結果が得られます。

例えば:

lst = [[1,2,3],[2,3,1],[4,2,1]]
for i in lst: 
  for v in i:
    print type(v)

<type 'int'>   #all the way through

for i in lst:
  for v in i:
    if v is int:
      print True

何も印刷されません。

for i in lst:
  for v in i:
    if v is not int:
      print False

すべて False を出力しますか? 特に整数であることを示すタイプでは、何が起こっているのかわかりません。

4

4 に答える 4

5

と言う代わりに

if v is int:

v が実際の型 int であるかどうかを尋ねています

言う

if isinstance(v, int):

これは、v がインスタンス化されたint(またはサブクラス)であることを示しています

int最初に整数(またはインスタンス化された)の例を次に示します

>>> v = 17
>>> type(v)
<type 'int'>
>>> v is int
False
>>> isinstance(v, int)
True
>>> 

次は型で

>>> v = int
>>> type(v)
<type 'type'>
>>> v is int
True
>>> isinstance(v, int)
False
>>> 
于 2012-05-23T06:01:56.337 に答える
2
v is not int

は言っているのと同じですが、より読みやすいバージョンの

not v is int

is各オペランド (型ではない) の参照を比較して、それらが同じかどうかを確認します。その例を次に示します。

>>> x = (1,2,3)
>>> y = (1,2,3)
>>> x == y
True
>>> x is y
False

したがって、v is int明らかに に評価されFalseます。notに変わり、if ステートメントが出力Falseされます。True

isinstance(v, int)正しい結果を得るために使用します。

于 2012-05-23T06:04:07.830 に答える
2

と同じオブジェクトの整数はありませんint。を使用しますisintance

を使用したくありませ。これは、 が のサブクラスであるtype(v) == int場合に False と評価されるためです。ほとんどの場合、これは望ましい動作ではありません。が、特定のオブジェクト (型とは何か) との比較に期待されるスタイルであるためです。vinttype(v) is intis

于 2012-05-23T06:02:19.150 に答える
1

isinstance を使用する必要があるという答えは正しいですが、それを行う別の方法は を使用することif type(v) == intです。

于 2012-05-23T06:03:32.637 に答える