Python序列类型,深拷贝与浅拷贝
Python有三种基本序列类型:list, tuple 和 range 对象。
序列可分为可变类型和不可变类型。tuple是不可变类型。
笔记要点
• 关于对象的复制的问题
• 列表统计,排序,append与extend的不同
列表
Python没有其他编程语言中的数组类型,列表(list)其实就有点类似数组,但是不同于其他编程语言中的数组一般只能是存放相同类型的数据(c语言数组都是定义了存放某类数据的),Python的列表类型可以存储任意类型,可以相同也可以不同。
另外,列表list也可以实现多维数组的结构,就是在列表里面嵌套列表。
列表切片索引
通过索引获取列表元素,获取列表元素的方式如下:start,
Python列表获取元素的方式类似数组获取元素的方式,不同的是,Python支持负数索引,可以表示列表最后的元素(这个描述感觉不准)
• 正数索引值,索引从0开始。从列表的开头开始获取元素。
• 负数索引值,从列表最后开始获取元素,-1 代表最后1个元素,-2 代表最后第2个元素,其他以此类推。
>>> # name_list 存放了26个字母
>>> name_list = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
>>> name_list[0:1]
['a']
>>> name_list[0:5]
['a', 'b', 'c', 'd', 'e']
>>> name_list[:5]
['a', 'b', 'c', 'd', 'e']
>>> name_list[5:10]
['f', 'g', 'h', 'i', 'j']
>>> name_list[5:]
['f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
>>> name_list[:]
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
>>> name_list[0:10:2]
['a', 'c', 'e', 'g', 'i']
# 负数索引
>>> name_list[-1:]
['z']
>>> name_list[-2:]
['y', 'z']
>>> name_list[-5:-2]
['v', 'w', 'x']
>>>
列表数据统计
如果列表内所有的数据全部是数值类型的话,可以使用Python内置函数max()求最大值,min()求最小值,sum()统计总和,进行一些简单的数据统计操作。
>>> num_list = [12,4,102,200,38,1,99,10,500]
>>> max(num_list)
500
>>> min(num_list)
1
>>> sum(num_list)
966
如果列表内的全部数据都是字符或字符串的话,也可以使用max()和min(),但是不能使用sum()。
这里max() 与 min() 函数是根据字符的Unicode码值的大小来进行比较的,并且是按单个字符进行比较,比如 字符 ‘x’ 就比 ‘abcdf’ 大,只有当第一个字符相等时才会接着比较第二个字符。
>>> name_list = ['a','b',"c","ab"]
>>> max(name_list)
'c'
>>> min(name_list)
'a'
>>> name_list = ['a','b',"c","db"]
>>> max(name_list)
'db'
>>> name_list = ["agk","fkd","x"]
>>> max(name_list)
'x'
>>> min(name_list)
'agk'
>>> max(name_list)
'yyy'
>>> name_list = ["abc","dfg","uxh","yab","yxa","xas"]
>>> max(name_list)
'yxa'
>>> name_list = ["a","ab","abc"]
>>> max(name_list)
'abc'
>>> name_list = ["a","ab","aacdefg"]
>>> min(name_list)
'a'
>>> max(name_list)
'ab'
>>> sum(name_list)
Traceback (most recent call last):
File "<pyshell#25>", line 1, in <module>
sum(name_list)
TypeError: unsupported operand type(s) for +: 'int' and 'str'
列表排序
- list对象的reversr()方法(直接对原列表倒序排列)
- list对象的sort()函数(直接对原列表排序)
- 切片索引方式实现倒序排列:name_list[::-1]
- python内置函数sorted()排序,返回的是一个新的列表
- 多级排序:Operator 模块功能允许多级排序。比如对学生先按不同年级排序,同年级的再按年龄进行排序。
# list对象自身的排序方法:是在原列表上排序。
# 切片倒序排序,返回是新列表,倒序排列
>>> name_list = [1,2,3,4,5,6,7,8]
>>> id(name_list)
53493704
>>> new_list = name_list[::-1]
>>> new_list
[8, 7, 6, 5, 4, 3, 2, 1]
>>> id(new_list)
50999368
>>> name_list
[1, 2, 3, 4, 5, 6, 7, 8]
# 内置sorted(key=None, reverse=False)函数, list.sort(key=None, reverse=False)方法,可以通过
# key参数指定排序所要使用的键,key参数是一个函数,函数的参数是要进行排序的元素,函数的返回值是排序依据的
# 键, reverse参数是进行升序降序。
class Student:
def __init__(self, name, grade, age):
self.name = name
self.grade = grade
self.age = age
def __repr__(self):
return repr((self.name, self.grade, self.age))
student_objects = [
Student('john', 'A', 15),
Student('jane', 'B', 12),
Student('dave', 'B', 10),
]
# 按年龄排序
sorted(student_objects, key=lambda student: student.age) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
# 多级排序
from operator import itemgetter, attrgetter
sorted(student_objects, key=attrgetter('grade', 'age'))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
列表添加元素append() 与 extend()
- append()方法参数可以是任意对象,可以是普通对象也可以是列表,需要注意的是:当被添加的是列表时,是整个列表被当做原列表的一个元素添加进去。
>>> a_list = ["aa","bb","cc"]
>>> b_list = ["dd","ee"]
>>> a_list.append(b_list)
>>> a_list
['aa', 'bb', 'cc', ['dd', 'ee']]
- extend(self, iterable, /)方法参数是可迭代对象,extend方法是把被添加的可迭代对象内所有的元素逐一取出来添加到列表中。如:
>>> a_list = ["aa","bb","cc"]
>>> b_list = ["dd","ee"]
>>> a_list
['aa', 'bb', 'cc']
>>> b_list
['dd', 'ee']
>>> a_list.extend(b_list)
>>> a_list
['aa', 'bb', 'cc', 'dd', 'ee']
深拷贝与浅拷贝
浅层复制和深层复制之间的区别仅与复合对象 (即包含其他对象的对象,如列表或类的实例) 相关:
• 一个 浅层复制 会构造一个新的复合对象,然后(在可能的范围内)将原对象中找到的 引用 插入其中。
• 一个 深层复制 会构造一个新的复合对象,然后递归地将原始对象中所找到的对象的 副本 插入。
标准库中的Copy模块:
copy.copy(x)
返回 x 的浅层复制。
copy.deepcopy(x[, memo])
返回 x 的深层复制。
制作字典的浅层复制可以使用 dict.copy() 方法,而制作列表的浅层复制可以通过赋值整个列表的切片完成,例如,copied_list = original_list[:]。
暂时就这个,后面看看有啥具体疑惑不明的在补一下笔记。
本节内容参考资料:
Python3.7官方教程-copy模块
广告 一下
本文地址:https://blog.csdn.net/weixin_46576776/article/details/107120878