未按预期返回的Python嵌套整数列表
我正在编写这个函数来检查列表列表是否是有效的数独谜题。当我检查列表中的有效整数时,我得到了意想不到的结果 例如:未按预期返回的Python嵌套整数列表,python,list,types,Python,List,Types,我正在编写这个函数来检查列表列表是否是有效的数独谜题。当我检查列表中的有效整数时,我得到了意想不到的结果 例如: 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 全是假的?不确
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
全是假的?不确定发生了什么,尤其是当类型显示它们是整数时。而不是说
if v is int:
它询问v是否是int的实际类型
说
表示v是实例化的int
(或子类)
下面是一个示例,首先是一个整数(或实例化的int
)
>v=17
>>>类型(v)
>>>v是int
假的
>>>isinstance(v,int)
真的
>>>
接下来是一个类型
>>> v = int
>>> type(v)
<type 'type'>
>>> v is int
True
>>> isinstance(v, int)
False
>>>
>v=int
>>>类型(v)
>>>v是int
真的
>>>isinstance(v,int)
假的
>>>
没有整数是与int
相同的对象。您想使用isintance
您不想使用type(v)==int
,因为如果v
是int
的子类,则该值将计算为False,在大多数情况下,这根本不是所需的行为;如果你真的真的想这样做,那么dotype(v)is int
,因为is
是与特定对象进行比较的预期样式(这就是类型)。说你应该使用isinstance的答案是正确的,但另一种方法是使用if type(v)==int
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是int
显然计算为False
not
将False
转换为True
并打印if语句
使用isinstance(v,int)
获得正确的结果 嘿,谢谢你,尼克,我想说清楚,这是因为v是一个实例化的“type”int,而不是直接赋值的?是的v
是一个实例化的int
,而不是类型int
。我在答案中添加了一个例子,希望能让事情变得更清楚更有帮助,这是对Marcin的评论的扩展,对吗?谢谢你,你的评论与其他人的解释非常吻合。isinstance
与type(v)==int
做的事情不同isinstance(v,t)
将报告True
如果type(v)
评估t
或t
的任何子类@Marcin:我没有声称这等同于isinstance,我说这是OP想要做的另一种方式。子类在此上下文中是不相关的。@Junuxx除非…除非…问题中的示例代码不是OP编写的唯一代码。@Marcin:除非。。。除非数据中可能存在不应传递的int
子类的实际实例,例如True
和False
。我不相信。我手里的橘子和橘子的概念是一样的吗?我希望python中的是这样工作的。他们应该用==
表示等价,而是表示isinstance
@thg435真的吗?和身份测试相比,您多久编写一次类型检查?@Marcin:我不经常使用这两种方法如果param是int
对我来说比isinstance
听起来更好。
v is not int
not v is int
>>> x = (1,2,3)
>>> y = (1,2,3)
>>> x == y
True
>>> x is y
False