目录
一.列表sort
1.sort的功能:
2.sort的用法:
3.sort的注意事项:
二.列表clear
1.clear的功能:
2.clear用法:
三.列表copy
1.copy的功能:
2.copy的用法:
3.copy与二次赋值的区别:
4.什么是浅拷贝?
5.什么是深拷贝?
一.列表sort
1.sort的功能:
sort()函数是Python中用于原地排序(in-place sorting)的列表方法。它对列表进行修改,将其按照升序排序。
2.sort的用法:
参数:
- cmp可选参数,制定排序方案的函数,Python3中已经废弃,不要使用
- key-参数比较
- reverse-排序规则,reverse=True降序,reverse=False升序(默认)。
- cmp与key涉及函数学习,我们在日后讲解当前默认不传即可在Python3中,cmp参数已经被移除了。相反Sot方法现在接受一个可选的keys参数,用于指定一个函数,该函数接受一个元素,并返回一个用于排序的键,sort的方法是用这个键来确定列表中元素的顺序
- sort的用法-按照首字母排序
例如:
在上述示例中,我们首先创建了一个名为numbers的列表,其中包含一些整数。然后,我们使用sort()函数对列表进行排序。在排序完成后,numbers列表的元素按照升序重新排列。
需要注意的是,sort()函数是一个原地排序方法,它直接修改了原始列表,而不会创建新的排序列表。因此,排序后的结果将直接反映在原始列表上。
3.sort的注意事项:
拓展:key参数允许你指定一个函数,该函数将每个元素转换为一个可排序的键,然后
使用这些键来排序列表:
- 举个例子,我们定义了一个列表my_list,其中包含四个字符串元
素。然后,我们使用sort方法并传递key=len参数来对列表进行排序。这
个key参数指定了一个函数len,该函数接受一个字符串并返回它的长度。因此,sort方法将每个元素转换为它的长度,然后使用这些长度来排序列表。最后,我们打印排序后的列表,它按照字符串长度的升序排列
二.列表clear
1.clear的功能:
2.clear用法:
- 用法:list.clear()->该函数无参数,无返回值
- 使用clear函数比直接定义一个空列表更节省性能
当我们需要清空一个列表中的所有元素时,可以使用Python中的clear()函数。下面是一个例子,演示如何使用clear()函数清空一个列表:
在上面的例子中,我们首先创建了一个名为fruits的列表,其中包含四种水果。然后,我们使用clear()函数清空了这个列表。最后,我们打印出清空后的列表,可以看到列表中不再包含任何元素,变成了一个空列表。
三.列表copy
1.copy的功能:
- 将当前的列表复制一份相同的列表,新列表与旧列表内容相同,但内存空间不同
2.copy的用法:
- list.copy()->该函数无参数,返回一个一模一样的但内存地址不同的列表
3.copy与二次赋值的区别:
- a = [1,2,3]
- b = a
- 二次赋值的变量与原始变量享有相同内存空间
- 当你把[1,2,3)]赋值给一个变量时,实际上是在内存中创建了一个列表对象并让这个变量指向该对象。当你再将此变量赋值给另一个变量时(比如a=[1,2,3];b=a),Python解释器会让这两个变量都指向同一个列表对象,因为它们现在都引用了相同的内存地址。所以对于列表[1,2,3]来说,只有一个实例被创建,且被多个变量所引用,因此这些引用的变量的内存地址是相同的。然而,当你使用b=[1,2,3]时,Python解释器会在内存中新建一个包含相同值的列表对象,并让b指向该对象,与此同时a仍然指向原来的那个列表对象。所以这时候a和b引用的不是同一个对象,它们的内存地址就不同了。
- copy函数创建的新列表与原始列表不是一个内存空间,不同享数据变更
- copy属于浅拷贝
4.什么是浅拷贝?
- 通俗的说,我们有一个列表a,列表里的元素还是列表,当我们拷贝出新列表b后,无论是a还是b的内部的列表中的数据发生了变化后,相互之间都会受到影响
- 只能对数据结构的第一层数据进行拷贝,如果数据结构里有更深层的数据,则无法进行拷贝。深层的数据原始变量与新变量是共享的,发生变化也是共享的
- 对于字典和列表:拷贝父对象不会拷贝对象内部的子对象
- 对于数字和字符串,等同于赋值操作
5.什么是深拷贝?
- 不仅对第一层数据进行了copy,对深层的数据也进行copy,原始变量和新变量完完全全不共享数据
- 对于列表和字典,完全拷贝父对象及其子对象
- 对于数字和字符串,等同于赋值操作
下面是一个例子:
# coding:utf-8
"""
# coding:utf-8
a = [1, 2, 3]
print(id(a))
b = a
print(id(b))当你把 [1, 2, 3] 赋值给一个变量时,实际上是在内存中创建了一个列表对象并让这个变量指向该对象。当你再将此
变量赋值给另一个变量时(比如 a = [1, 2, 3]; b = a),Python 解释器会让这两个变量都指向同一个列表对象,因为它们现在
都引用了相同的内存地址。所以对于列表 [1, 2, 3] 来说,只有一个实例被创建,且被多个变量所引用,因此这些引用的变量的内存地址是相同的。
然而,当你使用 b = [1, 2, 3] 时,Python 解释器会在内存中新建一个包含相同值的列
表对象,并让 b 指向该对象,与此同时a 仍然指向原来的那个列表对象。所以这时候 a 和 b
引用的不是同一个对象,它们的内存地址就不同了。
**!!!重要内存地址是由解释器分配的,这是因为Python是一种解释型语言,它的代码是在运行时被解释器逐行执行的。
因此,解释器需要在运行时动态地分配内存来存储变量和对象。这与编译型语言不同,
编译型语言的代码是在编译时被转换成机器码,因此它们可以在运行时直接访问内存地址。
"""
"""
在Python中,变量实际上是对象的引用。当你进行浅拷贝时,你只是复制了对象的引用,而不是对象本身。
因此,如果你拷贝了一个包含其他对象引用的对象,那么这些引用将指向同一个对象。
例如,假设你有一个包含列表的字典,然后你进行浅拷贝。拷贝后的字典将包含与原始字典相同的列表引用
。如果你修改了其中一个列表,那么所有引用该列表的对象都将反映这些更改。
如果你想避免这个问题,你可以使用深拷贝。深拷贝将复
制对象及其所有子对象,而不是只复制引用。这样,即使你修改了一个对象,其他对象也不会受到影响。
"""
# 全体员工名单表-法一
staff_list = [
['燕燕', '小洁', '阿楠', '小欣', '辰辰', '小浩'], # 技术部
['小美', '威威', 'Letty', 'Sophia'], # 测试部
['萌萌', '飞飞', '小刚', '佰佰'], # 产品部
['Tom', '小慕'], # 行政部
['铭铭', 'Lily'], # 财务部
['天天', '小晴'] # 人力资源部
]
staff_list_copy = staff_list.copy()
# 根据Linda入职产品部、 琳琳入职技术部、小洁、辰辰离职、Letty离职 更新复制的员工表staff_list_copy
staff_list_copy[0].remove("小洁")
staff_list_copy[0].remove("辰辰")
staff_list_copy[1].remove("Letty")
staff_list_copy[2].append("Linda")
staff_list_copy[0].append("琳琳")
for personnel in staff_list_copy:
print(personnel)
print('\n')
print('\n')
# 全体员工名单表-法二
import copy
staff_list = [
['燕燕', '小洁', '阿楠', '小欣', '辰辰', '小浩'], # 技术部
['小美', '威威', 'Letty', 'Sophia'], # 测试部
['萌萌', '飞飞', '小刚', '佰佰'], # 产品部
['Tom', '小慕'], # 行政部
['铭铭', 'Lily'], # 财务部
['天天', '小晴'] # 人力资源部
]
staff_list_copy = copy.deepcopy(staff_list)
# 根据Linda入职产品部、 琳琳入职技术部、小洁、辰辰离职、Letty离职 更新复制的员工表staff_list_copy
staff_list_copy[0].remove("小洁")
staff_list_copy[0].remove("辰辰")
staff_list_copy[1].remove("Letty")
staff_list_copy[2].append("Linda")
staff_list_copy[0].append("琳琳")
for personnel in staff_list_copy:
print(personnel)
print('\n')
print('\n')
# 全体员工名单表-法三
staff_list = [
['燕燕', '小洁', '阿楠', '小欣', '辰辰', '小浩'], # 技术部
['小美', '威威', 'Letty', 'Sophia'], # 测试部
['萌萌', '飞飞', '小刚', '佰佰'], # 产品部
['Tom', '小慕'], # 行政部
['铭铭', 'Lily'], # 财务部
['天天', '小晴'] # 人力资源部
]
staff_list_copy = staff_list[:] # 也可以使用[0:],[:]不填默认是最小索引到最大索引,但是[:-1]这个方法不包含最后一个元素==[0:-1]
# 根据Linda入职产品部、 琳琳入职技术部、小洁、辰辰离职、Letty离职 更新复制的员工表staff_list_copy
staff_list_copy[0].remove("小洁")
staff_list_copy[0].remove("辰辰")
staff_list_copy[1].remove("Letty")
staff_list_copy[2].append("Linda")
staff_list_copy[0].append("琳琳")
for personnel in staff_list_copy:
print(personnel)
输出:
['燕燕', '阿楠', '小欣', '小浩', '琳琳']
['小美', '威威', 'Sophia']
['萌萌', '飞飞', '小刚', '佰佰', 'Linda']
['Tom', '小慕']
['铭铭', 'Lily']
['天天', '小晴']
['燕燕', '阿楠', '小欣', '小浩', '琳琳']
['小美', '威威', 'Sophia']
['萌萌', '飞飞', '小刚', '佰佰', 'Linda']
['Tom', '小慕']
['铭铭', 'Lily']
['天天', '小晴']
['燕燕', '阿楠', '小欣', '小浩', '琳琳']
['小美', '威威', 'Sophia']
['萌萌', '飞飞', '小刚', '佰佰', 'Linda']
['Tom', '小慕']
['铭铭', 'Lily']
['天天', '小晴']
进程已结束,退出代码0
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
评论(0)