Python列表数据处理全攻略(二):常用内置方法轻松掌握

2023-12-28 22:44:46

引言

亲爱的读者,你好!Python的列表在数据结构中占据着核心地位,对于学习与应用Python来说,它无疑是我们不可或缺的得力助手。它不仅能帮助我们有效地存储和整理数据,还为我们提供了众多内置方法,让数据处理工作变得简单且高效。在这篇博客中,我们将一同深入探索Python列表的这些内置方法,从基础到进阶,助你全面掌握列表处理的核心技巧。让我们开始吧!

Python列表常用内置方法

clear()

功能介绍

clear()方法是Python列表对象的一个内置方法,用于清空列表中的所有元素。它会将列表中的所有元素删除,并将列表长度设置为0。

语法

list.clear()

其中,list是要清空的列表对象。

示例

  1. 常规操作
my_list = [1, 2, 3, 4, 5]
print("原始列表:", my_list)
my_list.clear()
print("清空后的列表:", my_list)

运行结果:

原始列表: [1, 2, 3, 4, 5]
清空后的列表: []

进程已结束,退出代码0
  1. 清空一个嵌套列表:
nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print("原始嵌套列表:", nested_list)
nested_list.clear()
print("清空后的嵌套列表:", nested_list)

运行结果:

原始嵌套列表: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
清空后的嵌套列表: []

进程已结束,退出代码0
  1. 在循环中使用clear()方法:
my_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for i in range(len(my_list)):
    my_list[i].clear()  # 在每次循环时清空子列表
    print("清空后的列表:", my_list)

运行结果:

清空后的列表: [[], [4, 5, 6], [7, 8, 9]]
清空后的列表: [[], [], [7, 8, 9]]
清空后的列表: [[], [], []]

进程已结束,退出代码0

注意事项

  • clear()方法会直接修改原列表,而不是创建一个新的空列表。这是因为Python中的列表是可变对象,对列表的修改会影响到原始对象。
  • 在循环中使用clear()方法时需要小心,因为每次清空列表后,下一次循环迭代时,循环变量可能会因为列表长度的改变而跳过某些元素。因此,在循环中使用clear()方法时,通常建议先复制一份原列表,然后在复制的列表上进行操作。
  • 清空列表后,原列表中的所有元素都将被删除,无法再访问。因此,在调用clear()方法前,需要确保不再需要这些元素。如果需要保留这些元素,可以考虑将其存储到其他变量或数据结构中。

copy()

功能介绍

copy()方法用于创建一个列表的浅拷贝。浅拷贝意味着新列表与原列表是两个独立的对象,但它们包含的元素仍然是同一个对象,如果列表中包含其他可变对象,则这些可变对象与原列表中的对应元素仍然共享。

语法

list.copy()

其中,list是你要拷贝的列表。

示例

  1. 直接拷贝
a, b = 1, 2
sub_list = [3, 4]
original_list = [a, b, sub_list]
copied_list = original_list.copy()

# 返回原列表和新列表对象的内存地址
print(id(original_list))
print(id(copied_list))
print(id(copied_list) == id(original_list))

运行结果:

2608333351744
2608333351232
False

进程已结束,退出代码0
  1. 修改浅拷贝后的列表中的不可变对象
a, b = 1, 2
sub_list = [3, 4]
original_list = [a, b, sub_list]
copied_list = original_list.copy()


print("修改前:")
print(a, id(a))
print(original_list, id(original_list[0]))
print(copied_list, id(copied_list[0]))
print(id(a) == id(original_list[0]) == id(copied_list[0]))
print("-"*50)

# 修改新列表的第一个元素
copied_list[0] = 5

print("修改后:")
print(a, id(a))
print(original_list, id(original_list[0]))
print(copied_list, id(copied_list[0]))
print(id(a) == id(original_list[0]) == id(copied_list[0]))

运行结果:

在这里插入图片描述

从运行结果来看:

  • 在新列表copied_list修改前,对象aoriginal_list[0]copied_list[0]共享同一内存地址 ==> 三者实际上是同一对象;
  • 在新列表copied_list修改后,对象aoriginal_list[0]仍然共享同一内存地址。由于整数对象是不可变对象 ===> 新列表copied_list会新建一个内存地址存放修改后的元素 ===> 原列表original_list的元素并没有受到影响。

3:修改浅拷贝后的列表中可变对象

a, b = 1, 2
sub_list = [3, 4]
original_list = [a, b, sub_list]
copied_list = original_list.copy()


print("修改前:")
print(sub_list, id(sub_list))
print(original_list, id(original_list[-1]))
print(copied_list, id(copied_list[-1]))
print(id(sub_list) == id(original_list[-1]) == id(copied_list[-1]))

# 修改新列表的最后一个元素,即子列表
copied_list[-1][0] = 6

print("-"*50)
print("修改后:")
print(sub_list, id(sub_list))
print(original_list, id(original_list[-1]))
print(copied_list, id(copied_list[-1]))
print(id(sub_list) == id(original_list[-1]) == id(copied_list[-1]))

运行结果:

修改前:
[3, 4] 1845835995520
[1, 2, [3, 4]] 1845835995520
[1, 2, [3, 4]] 1845835995520
True
--------------------------------------------------
修改后:
[6, 4] 1845835995520
[1, 2, [6, 4]] 1845835995520
[1, 2, [6, 4]] 1845835995520
True

从运行结果来看:

  • 在新列表copied_list修改前,对象sub_listoriginal_list[-1]copied_list[-1]共享同一内存地址 ==> 三者实际上是同一对象;
  • 在新列表copied_list修改后,由于列表对象是可变对象 ===> 新列表copied_list直接原地修改子列表 ===> 对象sub_listoriginal_list[-1]copied_list[-1]仍然共享同一内存地址 ==> 原列表original_list的元素以及列表对象sub_list均会受到【修改】操作的影响。

注意事项

  1. copy()方法只进行浅拷贝,如果列表中包含其他可变对象(如列表、字典等),则这些对象与原列表中的对应元素仍然共享。如果你需要深拷贝(即完全独立地复制对象及其包含的所有对象),则需要使用其他方法,如copy模块的deepcopy()函数。
  2. copy()方法返回的是原列表的一个浅拷贝,新列表与原列表是两个独立的对象,但它们包含的元素(如果元素是可变对象)仍然是同一个对象。这意味着,如果你更改了浅拷贝后的列表中的可变对象(如嵌套列表),这会影响原列表中的对应元素,因为它们实际上指向的是同一个对象。
  3. copy()方法的时间复杂度是O(n),其中n是列表的长度。这是因为该方法需要遍历整个列表以复制其内容。如果你需要频繁地进行深拷贝或大规模数据的复制操作,可能需要考虑使用更高效的数据结构或方法。

总结

Python的列表对象的copy()方法是一个简单且常用的方法,用于创建列表的浅拷贝。它返回的是原列表的一个新的副本,但新列表与原列表包含的元素(如果元素是可变对象)仍然是同一个对象。这意味着浅拷贝后的列表与原列表在大部分情况下是独立的,但它们包含的可变对象仍然是共享的。在使用copy()方法时,需要注意其限制和潜在的问题。如果你需要完全独立地复制对象及其包含的所有对象,则需要使用深拷贝的方法。

结束语

  • 亲爱的读者,感谢您花时间阅读我们的博客。我们非常重视您的反馈和意见,因此在这里鼓励您对我们的博客进行评论。
  • 您的建议和看法对我们来说非常重要,这有助于我们更好地了解您的需求,并提供更高质量的内容和服务。
  • 无论您是喜欢我们的博客还是对其有任何疑问或建议,我们都非常期待您的留言。让我们一起互动,共同进步!谢谢您的支持和参与!
  • 我会坚持不懈地创作,并持续优化博文质量,为您提供更好的阅读体验。
  • 谢谢您的阅读!

文章来源:https://blog.csdn.net/qq_41813454/article/details/135265422
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。