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

没有整数是与 相同的对象int。你想用isintance.

不想使用type(v) == int,因为如果v是 的子类,它将评估为 False int,这在大多数情况下根本不是所需的行为;如果您真的非常想要那样做,那么 do type(v) is int,因为这is是与特定对象(类型是什么)进行比较的预期样式。

于 2012-05-23T06:02:19.150 回答
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显然评估为Falsenot变成FalseTrue打印 if 语句。

用于isinstance(v, int)正确的结果。

于 2012-05-23T06:04:07.830 回答
1

说您应该使用 isinstance 的答案是正确的,但另一种方法是使用if type(v) == int.

于 2012-05-23T06:03:32.637 回答