Python 数据类型

示例

内置类型

布尔值

bool:True或的布尔值False。逻辑运算,如and,or,not可以针对布尔值进行。

x or y    # 如果x为False,则y否则为x 
x and y   # 如果x为False,则x否则为y
not x     # 如果x为True,则为False,否则为True

在Python2.x和Python 3.x中,布尔值也是int。该bool类型是一个子int类型,True并且False是其唯一的实例:

issubclass(bool, int) # 真正

isinstance(True, bool) # 真正
isinstance(False, bool) # 真正

如果布尔值用于算术运算,则将使用它们的整数值(1和0forTrue和False)返回整数结果:

True + False == 1 # 1 + 0 == 1
True * True  == 1 # 1 * 1 == 1

号码

  • int:整数

    a = 2
    b = 100
    c = 123456789
    d = 38563846326424324

    Python中的整数具有任意大小。

    注意:在旧版本的Python中,提供了一种long类型,该类型不同于int。两者已经统一。

  • float:浮点数;精度取决于实现和系统体系结构,对于CPython,float数据类型对应于C double。

    a = 2.0
    b = 100.e0
    c = 123456789.e1
  • complex:复数

    a = 2 + 1j
    b = 100 + 10j

的<,<=,>和>=运营商将提高一个TypeError当任何操作数是复数例外。

弦乐

Python 3.x 3.0
  • str:一个unicode字符串。的类型'hello'

  • bytes:一个字节字符串。的类型b'hello'

Python 2.x 2.7
  • str:一个字节字符串。的类型'hello'

  • bytes:的同义词 str

  • unicode:一个unicode字符串。的类型u'hello'

序列和集合

Python区分有序序列和无序集合(例如set和dict)。

  • 字符串(str,bytes,unicode)是这样的序列

  • reversed:str具有reversed功能的倒序

    a = reversed('hello')
  • tuple:n任何类型(n >= 0)的值的有序集合。

    a = (1, 2, 3)
    b = ('a', 1, 'python', (1, 2))
    b[2] = 'something else' # 返回TypeError

    支持索引;一成不变 如果所有成员都是可哈希的,则可哈希

  • list:n值的有序集合(n >= 0)

    a = [1, 2, 3]
    b = ['a', 1, 'python', (1, 2), [1, 2]]
    b[2] = 'something else' # 允许的

    不可散列;易变的。

  • set:唯一值的无序集合。项目必须是可哈希的。

    a = {1, 2, 'a'}
  • dict:唯一键值对的无序集合;键必须是可哈希的。

    a = {1: 'one',
        2: 'two'}
    b = {'a': [1, 2, 3],
        'b': 'a string'}

如果对象的哈希值在其生命周期内从未改变(需要一个__hash__()方法),并且可以与其他对象(需要一个__eq__()方法)进行比较,则该对象是可哈希的。比较相等性的可哈希对象必须具有相同的哈希值。

内置常数

结合内置数据类型,内置名称空间中有少量内置常量:

  • True:内置类型的真实值 bool

  • False:内置类型的假值 bool

  • None:用于表示信号不存在的单例对象。

  • Ellipsis或...:在任何地方的Python3 +核心中使用,在Python2.7 +中作为数组符号的一部分使用有限。numpy并且相关的软件包将其用作数组中的“包括所有内容”的引用。

  • NotImplemented:用于向Python表示特殊方法不支持特定参数的单例,Python会尝试其他替代方法(如果有)。

a = None #没有值将被分配。以后可以分配任何有效的数据类型

Python 3.x 3.0

None没有任何自然顺序。使用排序比较操作符(<,<=,>=,>)不再被支持,将引发TypeError。

Python 2.x 2.7

None始终小于任何数字(None < -32计算为True)。

测试变量类型

在python中,我们可以使用内置函数来检查对象的数据类型type。

a = '123'
print(type(a))
# Out: <class 'str'>
b = 123
print(type(b))
# Out: <class 'int'>

在条件语句中,可以使用来测试数据类型isinstance。但是,通常不鼓励依赖变量的类型。

i = 7
if isinstance(i, int):
    i += 1
elif isinstance(i, str):
    i = int(i)
    i += 1

有关type()和之间的区别的信息,isinstance()请参见:Python中isinstance和类型之间的区别

测试是否属于NoneType:

x = None
if x is None:
    print('Not a surprise, I just defined x as None.')

在数据类型之间转换

您可以执行显式数据类型转换。

例如,“ 123”是str类型,可以使用int函数将其转换为整数。

a = '123'
b = int(a)

可以使用float函数从浮点字符串(例如“ 123.456”)进行转换。

a = '123.456'
b = float(a)
c = int(a)    # ValueError:int()的无效文字,基数为10:“ 123.456”
d = int(b)    # 123

您还可以转换序列或集合类型

a = 'hello'
list(a)  # ['你好']
set(a)   # {'o','e','l','h'}
tuple(a) # ('你好')

文字定义时的显式字符串类型

在引号前面有一个字母标签,您可以知道要定义的字符串类型。

  • b'foo bar':bytes在Python 3中产生结果,str在Python 2中产生结果

  • u'foo bar':str在Python 3中产生结果,unicode在Python 2中产生结果

  • 'foo bar':结果 str

  • r'foo bar':结果即所谓的原始字符串,其中无需转义特殊字符,输入时一切都按原样进行

normal  = 'foo\nbar'   # 富
                       # 酒吧
escaped = 'foo\\nbar'  # 富\nbar   
raw     = r'foo\nbar'  # 富\nbar

可变和不可变数据类型

如果可以更改对象,则称为可变对象。例如,当您将列表传递给某个函数时,可以更改列表:

def f(m):
    m.append(3)  #在列表中添加一个数字。这是一个突变。

x = [1, 2]
f(x)
x == [1, 2]  # 现在为假,因为已将一项添加到列表中

如果无法以任何方式更改对象,则称为不可变对象。例如,整数是不可变的,因为无法更改它们:

def bar():
    x = (1, 2)
    g(x)
    x == (1, 2)  # 永远为True,因为没有函数可以更改对象(1、2)

请注意,变量本身是可变的,因此我们可以重新分配变量 x,但这不会更改x先前指向的对象。它只是x指向一个新对象。

实例可变的数据类型称为可变数据类型,对于不可变的对象和数据类型也类似。

不可变数据类型的示例:

  • int,long,float,complex

  • str

  • bytes

  • tuple

  • frozenset

可变数据类型的示例:

  • bytearray

  • list

  • set

  • dict