"""
列表类型 list:
作用:存储多个数据,根据指定值索引数据
作用:按位置存储多个数据的容器
定义:li = ['A', 12,24.48, 'Apple']
类型转换:list(para) 可迭代数据 底层相当于for循环
字典会传入key 把字典当成无序看待
"""
"""
列表的存储方式:
0:值*的内存地址名称
1:值*的内存地址名称
2:值*的内存地址名称
...
n:值*的内存地址名称
变量指向列表的内存地址空间
列表内*的内存地址名称,再指向*的内存地址空间
"""
x = 12
li = [8, x]
# 列表存储的是12的内存地址名称,而不是12这个值的内存地址
x = 24
# x的值改变了,24会新创建一个内存地址空间
# 但是列表中存储的内存地址名称没有随之改变
print(li[1]) # 不变
y = 12
lis = [8, y]
y = 24
lis = [8, y]
# 只有在y值改变后再定义列表,才会生效
print(lis[1]) # 不变
"""
队列:先进先出 FIFO:First In First Out
堆栈:先进后出 LIFO:Last In First Out
"""
# 队列
# 入栈操作
import poplib
li = []
li.append('first')
li.append('second')
li.append('third')
# 出栈操作
print(li.pop(0))
print(li.pop(0))
print(li.pop(0))
# 堆栈
# 入栈操作
li = []
li.append('first')
li.append('second')
li.append('third')
# 出栈操作
print(li.pop)
print(li.pop)
print(li.pop)
import copy
# pycharm中,退格键默认为4个空格
li1 = ['A', 12, 24, ['Apple', 1573]]
li2 = li1 # 赋值
# 二者指向同一个堆区的内存地址空间,操控同一个列表
li3 = li1.copy() # 浅拷贝:拷贝第一层
print(id(li1), id(li3)) # 地址不同
print(id(li1[0]), id(li3[0])) # 地址相同
# 虽然两者的内存地址不同,但是其记录的内容相同[数据或内存地址名称]
# 因此,其下层数据如果记录的是可变类型,依然会相互影响
print('-' * 21)
li4 = copy.deepcopy(li1)
print(id(li1), id(li4)) # 可变类型,地址不同
print(id(li1[0]), id(li4[0])) # 不可变类型,地址相同
print(id(li1[3]), id(li4[3])) # 可变类型,地址不同
print(id(li1[3][0]), id(li4[3][0])) # 不可变类型,地址相同
# 两个列表完全独立,互不影响 针对增删改操作
# 不可变类型,被改变数值时,会重新开辟内存空间,所以不会影响原列表的数据
li1 = [12, 24]
li2 = [48, 96]
li1.append(li2)
print(li1, id(li1), id(li1[2]))
# li1存放了数值12的内存地址名称,数值24的内存地址名称,以及li2的内存地址名称
li2.append(li1)
print(li2, id(li2), id(li2[2]))
# li2存放了数值48的内存地址名称,数值96的内存地址名称,以及li1的内存地址名称
del li1
del li2
# 两个列表相互引用,称之为循环引用
# 删除直接引用后,间接引用依然存在,因此不会被回收,成为无法回收的垃圾
"""
元祖类型 tuple:
作用:存储不可更改的多个数据
只能查询,不可增加、删除和修改
定义:tup = ('Apple',12)
"""
tup1 = (12,)
# 只有一个元素时,必须加一个 ,
tup2 = (12, 'A', [18, 24, 'banana'])
tup2[2][1] = 2400 # 元祖内可变类型的数据,其内容可以更改,元祖记录的内存地址名称不可更改
print(tup2)
print(tuple('时代方舟教育'))
# 字符串转为元组,用法与列表相同
"""
字典类型 dict:
作用:存储多个键值对数据 键不可重复,值可重复
键必须是不可变类型 值可以是任意数据类型
"""
"""
集合类型 set:
作用:可存储多个元素,集合内的元素为无序、不可重复的不可变类型
"""