专栏学习Day 3:list 和 tuple 的基本操作、深浅拷贝和切片操作详细等 5 个方面总结

本python学习系列旨在记录自己的学习情况与学习问题,希望能帮助自己培养良好的学习习惯。学习专栏来源于:https://gitbook.cn/m/mazi/comp/column?columnId=5e37978dec8d9033cf916b5d&utm_source=columnweixinshare&utm_campaign=Python%20%E5%85%A8%E6%A0%88%2060%20%E5%A4%A9%E7%B2%BE%E9%80%9A%E4%B9%8B%E8%B7%AF(微信打开)
未经本人允许请勿转载,有问题欢迎一起讨论。感谢!

列表list的基本操作

empty = []
lst = [1,'xiaoming',29.5,'17312662388']
lst2 = ['001','2019-11-11',['三文鱼','电烤箱']]
for _ in lst:
    print(f'{_}的类型为{type(_)}')

#打印结果:
1的类型为<class 'int'>
xiaoming的类型为<class 'str'>
29.5的类型为<class 'float'>
17312662388的类型为<class 'str'>

空列表在内存中指向一个地址但是没有值
lst2在内存中的位置比较特殊,最后一个元素是列表元素,它又指向一个新的地址,如下图:
图片由专栏提供

len(empty) # 0
len(lst) # 4
len(lst2) # 3

len函数:求list内元素个数(注意lst2是三个元素)
遍历lst内元素用for in函数,type函数可以得到类型;
这说明python的列表不要求元素类型一致

增减元素:

#例子:如何向 lst2 的第三个元素 ['三文鱼','电烤箱'] 内再增加一个元素 '烤鸭'。
lst2 = ['001','2019-11-11',['三文鱼','电烤箱']]
sku = lst2[2]  # 使用“整数索引”取出这个元素;此时sku 又是一个列表,注意数组从0开始
sku.append('烤鸭')  #列表的 append 方法增加元素,append 默认增加到 sku列表尾部
print(sku) # ['三文鱼', '电烤箱', '烤鸭']
sku.insert(1,'牛腱子')
print(sku) # ['三文鱼', '牛腱子', '电烤箱', '烤鸭']
item = sku.pop()  # 使用 pop 方法可直接移除列表尾部元素
print(sku) # ['三文鱼', '牛腱子', '电烤箱']
sku.remove('三文鱼') # 更好用:sku.remove(sku[0])
print(sku) # ['牛腱子', '电烤箱']

深浅拷贝

具体区别可以看下面链接 (参考,下面也会讲) https://www.cnblogs.com/wulaa/p/7896201.html

print(lst2) # ['001', '2019-11-11', ['牛腱子', '电烤箱']]

打印 lst2,发现第三个元素也对应改变,因为 sku 引用 lst2 的第三个元素,sku 指向的内存区域改变,所以 lst2 也会相应改变。如果不想改变 lst2 的第三个元素,就需要复制出 lst2 的这个元素,列表上有 copy 方法可实现复制:

lst2 = ['001','2019-11-11',['三文鱼','电烤箱']] # 这是lst2的初始值
sku_deep = lst2[2].copy() 

注意深浅拷贝:

#实现浅拷贝
a = [1,2,[3,4,5]]
ac = a.copy()
ac[0] = 10
ac[2][1] = 40
print(a[0] == ac[0])  #返回false 说明实现拷贝
print(a[2][1] == ac[2][1])    #返回true 说明ac[2][1]变化后a[2][1]也发生了变化 也就是说源列表与复制列表中的嵌套的列表指向的地址是一致的 说明是浅拷贝

图片来自专栏

#实现深拷贝
from copy import deepcopy  #调用copy模块里面的deepcopy函数
a = [1,2,[3,4,5]]
ac = deepcopy(a)
ac[0] = 10
ac[2][1] = 40
print(a[0] == ac[0])   #返回false,说明a与ac的地址不同
print(a[2][1] == ac[2][1])    #返回false,说明ac[2][1]变化后a[2][1]没有发生变化 也就是说源列表与复制列表中的嵌套列表指向的地址是不一样的 说明是深拷贝

图片来自专栏
切片:
举个例子:如a[:3] 表示获取列表的前三个元素
图片来自专栏
lst[::-1]:逆向切片操作

元组tuple基本操作

元组是不可变对象,无法增删元素
支持切片操作
count:实现对某个元素的个数统计
用法:元组名.count(元素)

可变与不可变

列表是可变的容器
可变与不可变的区别:如果是在列表的内存单位上有增减(元素个数发生变化)的话就是可变;把列表中的一个元素换成可以容纳更多元素的列表,使得其他元素指向其他地址的话 那就不能叫做可变
(原话:tuple 就是一个典型的不可变容器对象。对它而言,同样也可以修改嵌套对象的取值,但这并没有真正改变 tuple 内的元素。)
本质:元组一旦被创建后,长度就被唯一确定。

以上图片与代码均来自专栏
代码和正文中的括号部分是自己的注释,未必完全正确,若有误欢迎提出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值