Python中的数据类型
可变数据类型
对变量的值进行修改时,变量对应的内存地址不变,对应的值发生了改变,这种数据类型就称为可变数据类型。
不可变数据类型
对变量的进行修改时,变量对应的内存地址发生了改变(变量指向了新的内存),从而修改了变量的值,而变量对应的原内存的值并没有被改变,这种数据类型就称为可变数据类型。
也就是:不可变数据类型更改后地址发生改变,可变数据类型更改地址不发生改变
常用数据类型
数据类型 | 是否是可变数据类型 | 是否有序 |
---|---|---|
None (空) | 不可变 | - |
int (整数) | 不可变 | - |
float (浮点) | 不可变 | - |
bool (布尔) | 不可变 | - |
str (字符串) | 不可变 | - |
tuple (元组) | 不可变 | 序列类型,有序 |
list (列表) | 可变 | 序列类型,有序 |
set (集合) | 可变 | 序列类型,无序,不可重复 |
dict (字典) | 可变 | 映射类型,v3.6及以后无有序, 前面版本无序 |
扩展
数据类型 | 是否是可变数据类型 | 是否有序 | 说明 |
---|---|---|---|
bytes | 不可变 | - | 定义字节:b’hello’,bytes(5) |
bytearray | 可变 | - | 定义字节数组:bytearray(b’hello’), bytearray(10) |
complex (复数) | 不可变 | - | 由一个实数和一个虚数组合构成,如:4+3j |
frozenset (冻结的set) | 不可变 | 无序 | 冻结的set初始化后不能再添加或删除元素 |
array (数组) | 可变 | 有序 | 数组中的元素必须是同一类型 |
OrderedDict | 可变 | 有序 | key有序,setdefault取值key不存在也不报错 |
defaultdict | 可变 | 有序 | 取值时Key不存在也不会抛出KeyError异常 |
deque | 可变 | 有序 | 高效插入和删除的双向队列列表 |
常见数据类型的操作和转换
list列表[ ]
list是**==可变==、==可重复==的==有序==**列表,里面的元素的数据类型也可以不同(也可以是另一个list)。list可根据索引号取其中的数据。
list的生成
1 | list1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] |
list元素反转、排序和次数统计
1 | list1 = [0, 1, 2, 3, 4, 5, 5, 5, 6, 7, 8, 9] |
list元素的添加、删除和取值
1 | list1.append(10) |
list添加多个元素、list的合并
1 | list2 = [100, 101, 102] |
list的遍历
1 | for value in list1: |
list中使用切片(slice)取值
1 | elements = list1[0:3] # 取第0到3条元素(包括头不包括尾) |
==列表、元组和字符串==都可以使用切片进行操作
list的深copy和浅copy
1 | # 浅拷贝只拷贝了引用,没有拷贝内容 |
set集合{ }
set是**==可变==**、==不可重复==的==无序==列表。 ==set中不可以放入可变对象==,因为无法判断两个可变对象是否相等而去重。
set的定义
1 | set0 = {0, 0, 1, 2, 3, 4, 5, 4, 5, 6} # 直接定义set集合 |
set元素的添加、删除和取值
1 | set0 = {0, 0, 1, 2, 3, 4, 5, 4, 5, 6} |
set取并集和交集
1 | set1 = {"a", "b", 4, 6, 100} |
set遍历
注:set的遍历同list
dict字典{ }
dict是**==无序==,key==不可重复==、==不可变==**内容以key-value键值对形式存在的映射
dict中的key只能是不可变对象且唯一, 一个key对应一个value,多次对一个key设置value,后面的值会把前面的冲掉。
dict一般用在需要高速查找的很多地方。dict的key必须是不可变对象,这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这种通过key计算位置的算法称为哈希算法(Hash)。要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list、set是可变的,所以就不能作为key。
dict的创建和增删改查
1 | dict1 = {"addr": "北京", "age": 18, "gender": "女"} |
dict的遍历
1 | # dict的遍历 |
dict的合并
1 | dict2 = {"mobel": 15888888888, "postal_code": 10000} # 合并两个dict |
dict和list的异同
list查找和插入的时间随着元素的增加而增加;
占用空间小,浪费内存很少
dict查找和插入的速度极快,不会随着key的增加而变慢;
需要占用大量的内存,内存浪费多。
所以,dict是用空间来换取时间的一种方法。
dict的排序
1 | # dict排序 |
tuple元组( )
tuple是**==不可变==、==有序==**的列表,所以一般在定义tuple时就进行初始化赋值。
注意:
在定义只有一个元素的tuple时其元素后面要加逗号
1
2
3tuple0 = () # 创建空元祖
tuple0 = (1) # 不是tuple,会当成括号处理
tuple0 = (1,) # 正确的tupletuple虽然不可变但tuple中的元素对象却是可变的
1
2
3
4
5my_list = ["x", "y"]
tuple1 = ('a', 'b', my_list) # tuple包含list,list变化时,tuple1也就跟着变化
print("tuple1: ", tuple1) # tuple1: ('a', 'b', ['x', 'y'])
my_list.append("z")
print("tuple1 with my_list changed: ", tuple1) # tuple1变为('a', 'b', ['x', 'y', 'z'])
tuple的创建
1 | tuple2 = (1, "good", 2, 3, "good", True) # 创建元组,里面的元素类型可以不同 |
tuple中元素的增删改查
1 | element = tuple2[4] # 根据索引获取元组中的元素 |
tuple的遍历
注:tuple的遍历同list