我正在写这个函数,检查列表列表是否是一个有效的数独谜题。当我检查有效整数的列表时,我得到了意想不到的结果。
例如:
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
打印全部错误?不确定发生了什么,特别是显示它们是整数的类型。
答案 0 :(得分: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
>>>
答案 1 :(得分:2)
没有整数与int
是同一个对象。您想使用isintance
。
你不想要使用type(v) == int
,因为如果v
是int
的子类,那么评估为False,这在大多数情况下都是如此根本不是理想的行为;如果你确实这样做,真的想要那样做,type(v) is int
,因为is
是与特定对象(类型是什么)进行比较的预期样式。
答案 2 :(得分: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
将False
变为True
并打印if语句。
使用isinstance(v, int)
获得正确的结果。
答案 3 :(得分:1)
答案说你应该使用isinstance是正确的,但另一种方法是使用if type(v) == int
。