目录
在Python中,赋值、深拷贝和浅拷贝是非常常见的操作。它们之间的区别和联系对于Python程序员来说是非常重要的。下面我们将详细分析和总结Python的赋值、深拷贝和浅拷贝。
1. 赋值
在Python中,赋值是将一个对象的引用赋值给一个变量。例如:
from inner_datastruct import WEIXIN_URL
# 赋值 在Python中,赋值是将一个对象的引用赋值给一个变量
a = [1, 2, 3]
b = a
print(a, b) # [1, 2, 3] [1, 2, 3]
print(id(a), id(b)) # 1778558541376 1778558541376
a.append(WEIXIN_URL)
print(a, b) # [1, 2, 3, 'https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q'] [1, 2, 3, 'https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q']
在上面的代码中,变量a和变量b都指向了同一个列表对象[1, 2, 3]。因此,对变量a或变量b进行修改,都会影响到同一个列表对象。
2. 浅拷贝
浅拷贝是指创建一个新的对象,但是该对象的元素是原始对象的引用。例如:
# 浅拷贝
a = [1, 2, [3, 4]]
b = a.copy()
a[2][0] = 0x23 # 修改a中的列表元素
a.append(1234) # 添加元素不影响浅拷贝
a[0]=111 # 修改列表(非里面的列表元素)元素不影响浅拷贝
print(a, b) # [111, 2, [35, 4], 1234] [1, 2, [35, 4]]
print(id(a), id(b)) # 2806160065856 2806160061120
在上面的代码中,变量b是变量a的浅拷贝。当我们修改变量a中的列表元素时,变量b中的相应元素也会发生变化。例如:
a[2][0] = 5
print(b) # 输出:[1, 2, [5, 4]]
在上面的代码中,我们修改了变量a中的列表元素[3, 4]中的第一个元素,结果变量b中的相应元素也发生了变化。
3. 深拷贝
深拷贝是指创建一个新的对象,并且该对象的元素也是新的对象。例如:
# 深拷贝
import copy
a = [1, 2, [3, 4]]
b = copy.deepcopy(a)
print(a, b) # [1, 2, [3, 4]] [1, 2, [3, 4]]
print(id(a), id(b)) # 2501078710976 2501078674560
a[2][0] = 1234567
a[0] = WEIXIN_URL
# 深拷贝,改变变量a,不影响变量b
print(a, b) # ['https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q', 2, [1234567, 4]] [1, 2, [3, 4]]
在上面的代码中,变量b是变量a的深拷贝。当我们修改变量a中的列表元素时,变量b中的相应元素不会发生变化。例如:
a[2][0] = 5
print(b) # 输出:[1, 2, [3, 4]]
在上面的代码中,我们修改了变量a中的列表元素[3, 4]中的第一个元素,但是变量b中的相应元素没有发生变化。
4. 总结
在Python中,赋值、浅拷贝和深拷贝都是非常常见的操作。它们之间的区别和联系可以总结如下:
- 赋值是将一个对象的引用赋值给一个变量,变量和原始对象指向同一个内存地址。
- 浅拷贝是创建一个新的对象,但是该对象的元素是原始对象的引用,新对象和原始对象的元素指向不同的内存地址,但是元素中的引用指向同一个内存地址。
- 深拷贝是创建一个新的对象,并且该对象的元素也是新的对象,新对象和原始对象的元素指向不同的内存地址,元素中的引用也指向不同的内存地址。
因此,在实际编程中,我们需要根据具体情况选择合适的方法来进行对象的复制和修改。
更多资料 · 微信公众号搜索【CTO Plus】关注后,获取更多,我们一起学习交流。
关于公众号的描述访问如下链接