首页 > 编程知识 正文

Python中的赋值及深浅拷贝

时间:2023-11-20 18:09:12 阅读:295006 作者:GQNG

赋值和拷贝是Python中常用的操作,用于创建变量的引用和复制对象。本文将从多个方面详细阐述Python中的赋值和深浅拷贝。

一、赋值操作

在Python中,赋值操作使用等号(=)进行,将一个对象赋值给一个变量。

示例代码:

a = 10
b = a

以上代码将整数10赋值给变量a,然后将变量a的值赋值给变量b。这里b只是引用了a所引用的对象,它们指向同一个内存地址。当改变其中一个变量的值时,另一个变量也会发生变化。

赋值操作对于可变对象(例如列表、字典)和不可变对象(例如数字、字符串、元组)的行为有所不同。

对于不可变对象,赋值操作实际上是创建一个新的对象,并将变量指向该新对象。

示例代码:

a = 10
b = a
a = a + 1
print(a)  # 输出 11
print(b)  # 输出 10

在以上代码中,当执行"a = a + 1"时,实际上创建了一个新的整数对象11,并将变量a指向该对象。而变量b仍然指向原来的整数对象10。

对于可变对象,赋值操作只是将变量指向同一对象,并没有创建新的对象。

示例代码:

a = [1, 2, 3]
b = a
a.append(4)
print(a)  # 输出 [1, 2, 3, 4]
print(b)  # 输出 [1, 2, 3, 4]

以上代码中,变量a和b都指向同一个列表对象。当使用append()方法向列表中添加元素时,这个改变会同时影响到a和b。

二、浅拷贝

浅拷贝是创建一个新对象,该对象与原对象共享内部对象的引用。也就是说,新对象的部分数据是原对象的副本,而其他部分还是指向原对象中的相同对象。

在Python中,可以使用copy模块的copy()函数或者切片操作实现浅拷贝。

1、copy()函数:

示例代码:

import copy

a = [1, 2, [3, 4]]
b = copy.copy(a)
a[0] = 10
a[2][0] = 30
print(a)  # 输出 [10, 2, [30, 4]]
print(b)  # 输出 [1, 2, [30, 4]]

以上代码中,使用copy()函数对列表a进行浅拷贝得到列表b。当改变列表a的第一个元素和内部列表的第一个元素时,列表b的第一个元素不发生变化,但内部列表的元素发生变化。

2、切片操作:

示例代码:

a = [1, 2, [3, 4]]
b = a[:]
a[0] = 10
a[2][0] = 30
print(a)  # 输出 [10, 2, [30, 4]]
print(b)  # 输出 [1, 2, [30, 4]]

以上代码中,使用切片操作对列表a进行浅拷贝得到列表b。当改变列表a的第一个元素和内部列表的第一个元素时,列表b的第一个元素不发生变化,但内部列表的元素发生变化。

三、深拷贝

深拷贝是创建一个新对象,该对象以递归方式复制原对象及其所有子对象。也就是说,新对象和原对象完全独立,对新对象的修改不会影响原对象。

在Python中,可以使用copy模块的deepcopy()函数实现深拷贝。

示例代码:

import copy

a = [1, 2, [3, 4]]
b = copy.deepcopy(a)
a[0] = 10
a[2][0] = 30
print(a)  # 输出 [10, 2, [30, 4]]
print(b)  # 输出 [1, 2, [3, 4]]

以上代码中,使用deepcopy()函数对列表a进行深拷贝得到列表b。当改变列表a的第一个元素和内部列表的第一个元素时,列表b不受影响。

四、总结

赋值和拷贝是Python中常用的操作,在处理变量和对象时需要注意它们的区别和影响。赋值操作只是将变量指向同一个对象,而拷贝操作可以创建新的对象。浅拷贝创建一个新对象,但其部分内部对象仍然与原对象共享引用;而深拷贝创建一个新对象,递归复制原对象及其所有子对象。

在实际编程中,根据需要选择合适的赋值或拷贝方式,以确保程序的正确执行。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。