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

    科技2025-01-06  13

    本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 内的元素。) 本质:元组一旦被创建后,长度就被唯一确定。

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

    Processed: 0.010, SQL: 8