Python从入门到精通(微课精编版)
上QQ阅读APP看书,第一时间看更新

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()函数。