01_python基础-元组
元组
1. 为什么要将元组设计成不可变序列 ?
> 因为一旦创建了不可变对象,对象内部的所有数据就不能在被修改了,这样就避免了数据修改造成的错误;那么对于可变对象,在多任务环境下(多人操作同一块数据时[列表]/{字典},譬如增删改操作),那怎么办呢,解决方案是第一个人操作时就加锁,其他人操作就需要等待,这种方式是针对可变对象的,加锁来保证了数据的一个安全性。而不可变对象就不存在要不要加锁的问题,因为谁都操作不了。所以再多任务环境下,同时操作不可变对象时不需要加索。
2. 注意事项:
a. 元组中存储的是对象的引用
b. 如果元组中对象本身是不可变对象,则不能再引用其他对象
c. 如果元组中对象本身是可变对象,则可变对象的引用(id地址)不允许改变,但数据可以改变
解释b和c:
t = (10, [20,30], 9) #10和9是整数,本身不可变;[20, 30]是列表,可变对象
< test.py >
t = (10, [20, 30], 9)
# id() 为内存地址
print(t[0], type(t[0]), id(t[0])) # 10 <class 'int'> 4555574288
print(t[1], type(t[1]), id(t[1])) # [20, 30] <class 'list'> 4559055488
print(t[2], type(t[2]), id(t[2])) # 9 <class 'int'> 4555574256
'''尝试将[20, 30]修改为100'''
print(id(100)) # 先查看一下100的内存地址:4511754064
#t[1] = 100 # 报错:TypeError: 'tuple' object does not support item assignment,不可以将内存地址改变 ---解释b
'''
总结:由于[20,30]是列表可变序列,所以可以向列中添/减元素,而列表的内存地址不变;---解释c
'''
t[1].append(100)
print(t[1], type(t[1]), id(t[1])) # [20, 30] <class 'list'> 4559055488
可变对象和不可变对象:
> 可变:列表、字典 (可增删改,对象内存地址不改变)
> 可变:列表、字典 (可增删改,对象内存地址不改变)
列表元素可重复,有序;
字典元素key不可重复,value可重复,无序。
> 不可变:字符串、元组、集合(不可增删改,对象内存地址课改改变)
元组元素可重复,有序;
集合元素不可重复,无序。

浙公网安备 33010602011771号