Python判断 NoneType数据类型

在用OpenCV读取图片时候图片破损了会报错,说Nonetype类型。

所以,我就想,条件过滤的时候用is not 或者 != 就可以过滤了,比如这样尝试的时候:

type(answers[0].find_all("table")[0].string) is '''NoneType'''
结果我得到的是:

False
接下来,我用==或者is 来判断也是False,我就猜想,难到不能用type()来判断?

经过查找,发现Nonetype类型,其实就是值为None,所以直接判断值就可以了,比如这样:

answers[0].find_all("table")[0].string is None

得到的结果:

True

Nonetype和空值是不一致的,可以理解为Nonetype为不存在这个参数。空值表示参数存在,但是值为空。

### NoneType类型:

In [12]: a = None

In [13]: print type(a)

<type 'NoneType'>

### 判断方法:

if a is None:

pass

 


type()和isinstance()

type() 方法的语法:

type(name, bases, dict),其中name是类的名称,bases是基类的元组,dict是类内定义的命名空间变量。

当有一个参数时它的返回值是对象类型,。有三个参数时,返回值是新的类型对象。

 isinstance() 方法的语法:

isinstance(object, classinfo),其中object 是实例对象,变量,classinfo 可以是直接或间接类名、基本类型或者由它们组成的元组(如tuple,dict,int,str,float,list,set,bool,class类等)。如果对象的类型与classinfo相同则返回 值为True,否则返回值为 False。

isinstance() 与 type() 区别:

  • type() 不会认为子类是一种父类类型,不考虑继承关系。

  • isinstance() 会认为子类是一种父类类型,考虑继承关系。

如果要判断两个类型是否相同推荐使用 isinstance()。一般type(x)用来看变量x的类型较多。

以下展示了使用 type 函数的实例:


Python 中的比较:is 与 ==

在 Python 中会用到对象之间比较,可以用 ==,也可以用 is 。但是它们的区别是什么呢?

  • is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同。莱布尼茨说过:“世界上没有两片完全相同的叶子”,这个is正是这样的比较,比较是不是同一片叶子(即比较的id是否相同,这id类似于人的身份证标识)。

  • == 比较的是两个对象的内容是否相等,即内存地址可以不一样,内容一样就可以了(只看数值是否相同)。这里比较的并非是同一片叶子,可能叶子的种类或者脉络相同就可以了。默认会调用对象的 __eq__()方法。

     

可以通过如下例子来区分比较下:

>>> a = ["I", "love", "Python"]
>>> b = a
# a的引用复制给b,在内存中其实是指向了用一个对象
>>> b is a
True
>>> id(a)
46381384
>>> id(b)
46381384
# 当然,内容也肯定是相等的
>>> b == a
True

可以发现b和a的内存地址是相同的,它们指向同一块内存,因而 is 和 == 的结果都为True。

这是因为直接赋值都是赋值的引用,是引用,是引用,重要的事情说三遍。但如果不是通过引用赋值,而是通过切片赋值呢?

# b通过切片操作重新分配了对象,但是值和a相同
>>> b = a[:]
>>> b is a
False
>>> id(a)
48740680
>>> id(b)
48740680
>>> b == a # 但他们的值还是相等的
True

新建对象之后,b 和 a 指向了不同的内存,所以 b is a 的结果为False,而 b==a的结果为True。

在这里,小编提一个问题,b[0] is a[0] 的结果呢?

答案是True。因为切片拷贝是浅拷贝,列表中的元素并未重新创建。不理解的同学请翻看之前的文章 Python中的浅拷贝与深拷贝

通常,我们关注的是值,而不是内存地址,因此 Python 代码中 == 出现的频率比 is 高

但是什么时候用 is 呢?

is 与 == 相比有一个比较大的优势,就是计算速度快,因为它不能重载,不用进行特殊的函数调用,少了函数调用的开销而直接比较两个整数 id。而 a == b 则是等同于a.__eq__(b)。继承自 object 的 __eq__ 方法比较两个对象的id,结果与 is 一样。但是多数Python的对象会覆盖object的 __eq__方法,而定义内容的相关比较,所以比较的是对象属性的值。

在变量和单例值之间比较时,应该使用 is。目前,最常使用 is 的地方是判断对象是不是 None。下面是推荐的写法:

a is None

判断不是None的推荐写法是:

a is not None

Python会对比较小的整数对象进行缓存,下次用的时候直接从缓存中获取,所以is 和 == 的结果可能相同:

>>> a = 1
>>> b = 1
>>> a is b
True
>>> a == b
True

而看一下另外一段代码:

>>> a = 257
>>> b = 257
>>> a is b
False

这是什么原因呢?

注意,Python仅仅对比较小的整数对象进行缓存(范围为范围[-5, 256])缓存起来,而并非是所有整数对象。需要注意的是,这仅仅是在命令行中执行,而在Pycharm或者保存为文件执行,结果是不一样的,这是因为解释器做了一部分优化。

总结

1、is 比较两个对象的 id 值是否相等,是否指向同一个内存地址;
2、== 比较的是两个对象的内容是否相等,值是否相等;
3、小整数对象[-5,256]在全局解释器范围内被放入缓存供重复使用;
4、is 运算符比 == 效率高,在变量和None进行比较时,应该使用 is。

 


参考:

https://www.cnblogs.com/kiko0o0/p/8135184.html

http://www.runoob.com/python/python-func-type.html

https://blog.csdn.net/qq_38332574/article/details/80314827 

https://blog.csdn.net/qq_36330643/article/details/81185217 

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在Python中,NoneType是表示空对象的一种特殊类型。当一个变量没有被赋予任何值时,它的类型就是NoneType。我们可以使用type()函数来确定一个变量的类型,如果返回的是NoneType,则表示该变量为空。 例如,我们可以声明一个没有赋值的变量: ```python x = None ``` 如果我们想检查变量x是否为空,可以使用if语句来判断: ```python if x is None: print("变量x为空") else: print("变量x不为空") ``` 输出结果会是“变量x为空”,因为变量x的类型是NoneType,表示它是一个空对象。 除此之外,我们可以使用is 和 == 运算符来检查一个变量的类型。is运算符用于判断两个变量是否引用同一个对象,而== 运算符用于判断两个变量的值是否相等。 ```python x = None y = None if x is y: print("x和y引用同一个对象") if x == y: print("x和y的值相等") ``` 上述代码会输出两个判断条件的结果,也都会是True。因为x和y都是None,表示它们的值相等且都为空对象。 在编程中,判断变量的类型是否为NoneType非常有用,能够帮助我们避免空对象的操作和处理错误,提高代码的可靠性和稳定性。 ### 回答2: 在Python中,NoneType是一个特殊的数据类型,代表了一个空值或者缺失的值。用于表示一个对象或变量没有被赋予任何值。 在判断一个变量的类型是否是NoneType时,可以使用is关键字或者直接使用等号判断。 下面是一个示例代码: ```python # 定义一个函数,用于判断变量是否为NoneType def is_none(var): if var is None: print("变量是None类型") else: print("变量不是None类型") # 测试变量的类型 var1 = None var2 = 10 is_none(var1) # 输出:变量是None类型 is_none(var2) # 输出:变量不是None类型 ``` 在上述代码中,我们定义了一个is_none函数,用于判断变量是否是None类型。当变量使用is关键字和None进行判断时,如果相等则说明变量的类型是NoneType,否则不是。根据判断结果输出相应的提示信息。 需要注意的是,判断一个变量是否为NoneType时,一定要使用is关键字而不是直接使用等号。这是因为在Python中,使用等号判断两个变量是否相等时,实际上是判断它们的值是否相等,而不是判断它们的类型是否相等。 希望以上解答能够帮助到您! ### 回答3: 在Python中,NoneType是一个特殊的数据类型,表示一个空值或者不存在的对象。当一个变量没有被赋予任何值或者一个函数没有返回任何值时,它们的默认值就是None。 要判断一个变量的类型是否为NoneType,我们可以使用is关键字。例如: ``` x = None if x is None: print("x是NoneType") else: print("x不是NoneType") ``` 这段代码会输出"x是NoneType",因为变量x被赋值为None。 另外,有时候我们需要判断一个函数的返回值是否为None。可以使用if语句对函数的返回值进行判断。例如: ``` def get_value(): # some code here value = get_value() if value is None: print("函数get_value的返回值是None") else: print("函数get_value的返回值不是None") ``` 这段代码会输出"函数get_value的返回值是None",因为get_value()函数没有明确的返回值,所以默认返回None。 在编写程序时,我们经常需要对变量或函数的返回值进行NoneType判断,以避免出现错误或异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值