在Python中,最常见的内置容器类型有四种:列表、元组、字典、集合。
列表(list)是一种非常经典的容器类型,通常用来存放多个同类对象,比如从1到10的所有整数:
元组(tuple)和列表非常类似,但跟列表不同,它不能被修改。这意味着元组完成初始化后就没法再改动了:
字典(dict)类型存放的是一个个键值对(key: value)。它功能强大,应用广泛,就连Python内部也大量使用,比如每个类实例的所有属性,就都存放在一个名为dict的字典里:
集合(set)也是一种常用的容器类型。它最大的特点是成员不能重复,所以经常用来去重(剔除重复元素):
列表是一种有序的可变容器类型,是日常编程中最常用的类型之一。常用的列表创建方式有两种:字面量语法与list()内置函数。
使用[]符号来创建一个列表字面量:
Python里的内置数据类型,大致上可分为可变与不可变两种。
· 可变(mutable):列表、字典、集合。
· 不可变(immutable):整数、浮点数、字符串、字节串、元组。
列表是可变的。当我们初始化一个列表后,仍然可以调用.append()、.extend()等方法来修改它的内容。而字符串和整数等都是不可变的——我们没法修改一个已经存在的字符串对象。
示例二:为列表追加内容
示例解释
元组是一种有序的不可变容器类型。它看起来和列表非常像,只是标识符从中括号[]变成了圆括号()。由于元组不可变,所以它也没有列表那一堆内置方法,比如.append()、.extend()等。
跟列表和元组比起来,字典是一种更为复杂的容器结构。它所存储的内容不再是单一维度的线性序列,而是多维度的key: value键值对。
01.遍历字典
02.访问不存在的字典键
当用不存在的键访问字典内容时,程序会抛出KeyError异常,我们通常称之为程序里的边界情况(edge case)。针对这种边界情况,比较常见的处理方式有两种:
(1)读取内容前先做一次条件判断,只有判断通过的情况下才继续执行其他操作;(2)直接操作,但是捕获KeyError异常。
在Python 3.6版本以前,几乎所有开发者都遵从一条常识:“Python的字典是无序的。”这里的无序指的是:当你按照某种顺序把内容存进字典后,就永远没法按照原顺序把它取出来了。
集合是一种无序的可变容器类型,它最大的特点就是成员不能重复。集合字面量的语法和字典很像,都是使用大括号包裹,但集合里装的是一维的值{value, ...},而不是键值对{key: value, ...}。
在介绍字典类型时,我们说过字典底层使用了哈希表数据结构,其实集合也一样。当我们把某个对象放进集合或者作为字典的键使用时,解释器都需要对该对象进行一次哈希运算,得到哈希值,然后再进行后面的操作。这个计算哈希值的过程,是通过调用内置函数hash(obj)完成的。如果对象是可哈希的,hash函数会返回一个整型结果,否则将会报TypeError错误。因此,要把某个对象放进集合,那它就必须是“可哈希”的。话说到这里,到底哪些类型是可哈希的?哪些又是不可哈希的呢?我们来试试看。
总结一下,某种类型是否可哈希遵循下面的规则:(1)所有的不可变内置类型,都是可哈希的,比如str、int、tuple、frozenset等;(2)所有的可变内置类型,都是不可哈希的,比如dict、list等;(3)对于不可变容器类型(tuple, frozenset),仅当它的所有成员都不可变时,它自身才是可哈希的;(4)用户定义的类型默认都是可哈希的。谨记,只有可哈希的对象,才能放进集合或作为字典的键使用。