2.3 数据类型
2.3.1 认识类型
在Python中,所有数据都是由对象或对象间关系来表示的。每个对象都拥有3个基本特性。
➢ 编号:ID身份标识。一个对象被创建后,它的编号就不会改变,可以理解为该对象在内存中的地址。使用内置函数id(obj)可以获取对象obj的ID编号,编号为一组整型的数字。使用is运算符可以比较两个对象的编号是否相同。
➢ 类型:类型决定对象所支持的操作,并且定义了该类型的对象可能的取值。使用内置函数type(obj)可以获取对象obj的类型。注意,类型本身也是对象,一个对象的类型也是不可改变的。
➢ 值:对象拥有的具体数据。值可以改变的被称为可变对象,值不可以改变的被称为不可变对象。一个对象的可变性是由类型决定的。例如,数字、字符串和元组是不可变的,而字典、列表和集合是可变的。
提示:一个不可变容器对象如果包含对可变对象的引用,当后者的值改变时,前者的值也会改变。但是该容器仍属于不可变对象,因为它所包含的对象集是不会改变的。因此,不可变并不严格等同于值不能改变。
对象不会被显式地销毁,当无法访问时,它们可能会作为垃圾在恰当时机被回收。
Python内置类型可以分为2类,具体如下。
➢ 标准数据类型:如数字(int、float、complex)、序列(list、tuple、range)、文本序列(str)、二进制序列(bytes、bytearray、memoryview)、集合(set、frozenset)、映射(dict)、迭代器、上下文管理器等。
➢ 其他内建类型:包括模块、类和实例、函数、方法、类型(type)、空对象(None)、省略符对象、代码对象、布尔值、未实现对象、内部类型等。其中,内部类型包括栈帧对象、回溯对象、切片对象。
2.3.2 类型检测
1.使用isinstance()
isinstance()函数能够检测一个值是否为指定类型的实例。语法格式如下:
isinstance(object, type)
参数object为一个对象,参数type为类型名(如int),或者是类型名的列表,如(int,list,float)。返回值为布尔值。
【示例1】下面代码检测变量n的类型。
n = 1 print(isinstance(n, int)) # 输出为 True print(isinstance(n, str)) # 输出为 False print(isinstance(n, (str, int, float))) # 输出为 True print(isinstance(n, (str, list, dict))) # 输出为 False
2.使用type()
type()函数可以返回对象的类型。
【示例2】下面代码使用type()函数检测几个值的类型。
print(type(1)) # 输出为 <class 'int'> print(type(1.0)) # 输出为 <class 'float'> print(type('1')) # 输出为 <class 'str'> print(type(True)) # 输出为 <class 'bool'> print(type([2])) # 输出为 <class 'list'> print(type({0: '2'})) # 输出为 <class 'dict'>
【示例3】可以通过type()函数返回值与类型是否相等,判断一个值的类型。
val = 23 if type(val) == int : print("检测通过,值为整数") else: print("变量的值非法")
提示:isinstance()函数考虑继承关系,而type()函数不考虑继承关系。
【示例4】下面示例定义两个类型,创建一个A对象,再创建一个继承A对象的B对象,使用isinstance()和type()来比较A()和A时,由于它们的类型都是一样的,所以都返回True。而B对象继承A对象,在使用type()函数来比较B()和A时,不会考虑B()继承自哪里,所以返回False。
class A: pass class B(A): pass print(isinstance(A(), A)) # 输出为 True print(type(A()) == A) # 输出为 True print(isinstance(B(), A)) # 输出为 True print(type(B()) == A) # 输出为 False
提示:如果要判断两个类型是否相同,推荐使用isinstance()函数。