详解Python列表赋值复制深拷贝及5种浅拷贝

详解Python列表赋值复制深拷贝及5种浅拷贝

在Python中,列表是一种常见的数据类型,它可以存储任意类型的数据。在使用时,我们经常需要对其进行赋值、复和贝等操作。本攻略将详细介绍Python中列表的赋值、复制深拷贝和浅拷贝等操作。

列表赋值

在Python中,列表赋值是将一个列表的引用赋值给另一个变量。这意味着两个变量将引用同一个列表对象。以下是一个示例代码,演示如何进行列表赋值:

# 列表赋值
list1 = [1, 2, 3]
list2 = list1

# 修改list1中的元素
list1[0] =100

# 输出list和list2
print(list1)  # 输出[100, 2, 3]
print(list2)  # 输出[100, 2, 3]

在上面的示例代码中,我们将列表list1的引用赋值给了list2,并修改了1中的元素。由于list1list2引用同一个列表对象,所以修改list1中元素也影响list2中的元素。

列表复制

在Python中,列表复制是将一个列表的所有元素复制到一个新的列表中。这意味着两个列表是独立的,修改一个列表不会影响另一个列表。以下是一个示例代码,演示如何进行列表复制:

# 列表复制
list1 = [1, 2, 3]
list2 = list1.copy()

# 修改list1中的元素
list1[0] = 100

# 输出list1和list2
print(list1)  # 输出[100, 2, 3]
print(list2)  # 输出[1, 2, 3]

在上面的示例代码中,使用copy()方法将list1复制到list2,并修改了list1中的元素。由于list1list2是独立的,所以修改list1中的元素不会影响list2中的元素。

列表浅拷贝

在Python中,列表浅拷贝是将一个列表的所有元素复制到一个新的列表中,但是对于嵌套的列表、元组、字典等对象,只复制其引用而不是对象本身。这意味着修改嵌套对象中的元素会响原始列表和浅拷贝的列表。以下是一个示例代码,演示如何进行列表浅拷贝:

# 列表浅拷贝
list1 = [1, 2, [3, 4]]
list2 = list1.copy()

# 修改list1中的元素
list1[2][0] = 100

# 输出list1和list2
print(list1)  # 输出[1, 2, [100, 4]]
print(list2)  # 输出[1, 2, [100, 4]]

在上面的示例代码中,我们使用()方法将list1浅拷贝到list2,并修改了list1嵌套列表的元素。由于浅拷贝只复制了嵌套列表的引用,所以修改嵌套列表中的元素会影响原始列表和浅拷贝的列表。

列表深拷贝

在Python中,列表深拷贝是将一个列表的所有元素复制到一个新列表中,包括嵌套的列表、元组、字典等对象。这意味着深拷贝的列表是完全独立的,修改一个列表会影响另一个列表。以下是一个示例代码,演示如何进行列表深贝:

# 列表深拷贝
import copy

list1 = [1, 2, [3, 4]]
list2 = copy.deepcopy(list1)

# 修改list1中的元素
list1[2][0] = 100

# 输出list1和list2
print(list1)  # 输出[1, 2, [100, 4]]
print(list2)  # 输出[1, 2, [3, 4]]

在上面的示例代码中,我们使用deepcopy()方法将list1深拷贝到list2,并修改了list1`中嵌套列表的元素。由于深拷贝复制了嵌套列表的对象本身,所以修改嵌套列表中的元素不会影响原始列表和深拷贝的列表。

5种浅拷贝

在Python中,除了使用copy()方法进行浅拷贝外,还有5种方法可以进行浅拷贝。这些方法包括切片、list()构造函数、*运算符、.copy()方法和copy.copy()方法。以下是一个示例代码,演示如何使用这5种方法进行浅拷贝:

# 5种浅拷贝方法
list1 = [1, 2, [3, 4]]

# 切片
list2 = list1[:]
# list()构造函数
list list(list1)
# *运算符
list4 = list1 * 1
# list.copy()方法
list5 = list1.copy()
# copy.copy()方法
import copy
list6 = copy.copy(list1)

# 修改list1中的元素
list1[2][0] = 100

# 输出list1和浅拷贝的列表
print(list1)  # 输出[1, 2, [100, 4]]
print(list2)  # 输出[1, 2, [100, 4]]
print(list3)  # 输出[1, 2, [100, 4]]
print(list4)  # 输出[1, 2, [100, 4]]
print(list5)  # 输出[1, 2,100, 4]]
print(list6)  # 输出[1, 2, [100, 4]]

在上面的示例代码中,我们使用了5种方法进行浅拷贝,并修改了原始列表嵌套列表的元素。由浅拷贝只复制了嵌套列表的引用,所以修改嵌套列表中的元素会影响原始和浅拷贝的列表。

示例

以下是另一个示例代码,演如何在Python中使用浅复制和深复制:

# 创建一个列表
my_list = [1, 2, 3, [4, 5, 6]]

# 进行浅复制
new_list1 = my_list.copy()

# 进行深复制
import copy
new_list2 = copy.deepcopy(my_list)

# 修改原列表中的元素
my_list[3][0] = 100

# 输出原列表和新列表
print(my_list)  # 输出[1, 2, 3, [100, 5, 6]]
print(new_list1)  # 输出[1, 2, 3, [100, 5, 6]]
print(new_list2)  # 输出[1, 2, 3, [4, 5, 6]]

在上面的示例代码中,我们创建了一个列表my_list,并进行了浅复制和深复制,分别创建了新列表new_list1new_list2。然后,我们修改了原列表中的元素[4, 5, 6]的第一个元素为100。最后,我们输出了原列表和新列表,发现浅复制的新列表和原列表中的元素指向同一个内存地址,所以修改原列表中的元素也会影响新列表中的元素;而深复制的新列表和原列表中的元素不是同一个内存地址,所以修改原列表中的元素不会影响新列表中的元素。

总结

在Python中,列表的复制有两种方式:浅复制和深复制。浅复制是指复制一个列表,创建一个新的列表,但是新列表中的元素是原列表中元素的引用;深复制是指复制一个列表,创建一个新的列表,新列表中的素是原列表中元素的副本。在使用列表时,需要根据实际情况选择浅复制或深复制。

另外,除了使用copy()方法进行浅拷贝外,还有5种方法可以进行浅拷贝,包括切片、list()构造函数、*运算符、list.copy()方法和copy.copy()方法。需要根据实际情况选择合适的方法进行浅拷贝。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python列表赋值复制深拷贝及5种浅拷贝 - Python技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • Python从list类型、range()序列简单认识类(class)【可迭代】

    以下是“Python从list类型、range()序列简单认识类(class)【可迭代】”的完整攻略。 1. list类型 list是Python中最常用的数据类型之一,它是一种有序的可变序列可以包含任意类型的对象。list可以通过方括号[]或list()函数来创建。 1.1 创建list my_list = [1, 2, 3, 4, 5] 在上面的示例代码…

    python 2023年5月13日
    00
  • python格式化输出实例(居中、靠右及靠左对齐)

    下面我将详细讲解“python格式化输出实例(居中、靠右及靠左对齐)”的完整攻略。 标准格式化输出 Python 的字符串格式化符号是 %,使用起来跟 C 语言类似。我们在输出字符串时可以使用它来将字符串和数据拼接在一起,从而输出想要的结果。 %s —— 字符串 (或任何对象的字符串表示) %d —— 十进制整数 %f —— 浮点数 %x/%X —— 十六进…

    python 2023年6月5日
    00
  • 使用python 对验证码图片进行降噪处理

    以下是对“使用Python对验证码图片进行降噪处理”的完整攻略。 1. 背景介绍 验证码(CAPTCHA)是网络应用程序中常用的一种图形验证码,用于区分人类用户和计算机程序的区别。由于验证码图像的复杂性和噪声,使得自动识别验证码成为一个具有挑战性的问题。在验证码自动识别的过程中,验证码图片的降噪处理是一个必不可少的步骤,这个过程可以极大地提高验证码的识别准确…

    python 2023年5月18日
    00
  • 如何在 Redis 中使用 Lua 脚本实现原子操作?

    以下是详细讲解如何在 Redis 中使用 Lua 脚本实现原子操作的完整使用攻略。 Redis Lua 脚本简介 Redis Lua 脚本是 Redis 的一个高级功能,可以使用 Lua 脚本实现原子操作。Redis 脚本的特点如下: Redis Lua 脚本是原子的,保证操作的原子性。 Redis Lua 脚本是可扩展的,通过编写 Lua 脚本实现各种功能…

    python 2023年5月12日
    00
  • python multiprocessing多进程变量共享与加锁的实现

    下面我来详细讲解一下“python multiprocessing多进程变量共享与加锁的实现”的完整攻略。 简介 Python 的 multiprocessing 模块提供了一种使用多进程并行处理数据的方法,可以显著提高数据处理的速度。不过在多进程编程中,每个进程独立运行,各自维护着自己的内存空间,因此共享变量需要特别处理,否则容易出现多个进程并发修改同一个…

    python 2023年6月6日
    00
  • Python文件夹与文件的操作实现代码

    下面是Python文件夹与文件的操作实现代码的完整攻略。 1. 获取文件路径 对于文件夹和文件的操作,首先需要获取其路径。Python提供了os库来进行路径操作。 获取当前文件夹路径 import os current_dir = os.getcwd() print(f"当前文件夹路径为:{current_dir}") 上述代码使用get…

    python 2023年5月31日
    00
  • 使用python3.0 对接美团接口的实现示例

    下面就让我把使用 Python 3.0 对接美团接口的实现示例的完整攻略分享给您。 一、准备工作 在美团开发平台注册开发者账号并创建应用。 根据接口文档和开发文档了解需要调用的接口详情,并获取 App Key 以及 App Secret。 二、安装 Requests 库 打开终端(terminal),输入以下命令行并回车: pip install reque…

    python 2023年6月3日
    00
  • 解决pycharm启动后总是不停的updating indices…indexing的问题

    这个问题是由于Pycharm在启动时需要对Python包进行扫描索引,如果包数量较多,则需要一些时间来进行索引。但是有些情况下,这个过程可能会出现意外中断,导致Pycharm无法完成索引任务。 以下是解决这个问题的步骤: 1. 检查是否有防火墙或者代理软件导致的网络问题 在索引Python包时,Pycharm需要连接到网站来获取Python包的信息。因此,如…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部