Python共享引用和原处修改

本文介绍了Python中对象拷贝的概念,区分了不可变对象与可变对象在赋值过程中的不同行为。对于不可变对象,如数字、字符串等,改变一个变量不会影响其他变量;而可变对象如列表、字典等,修改一个变量会影响到其他变量。文章还提供了如何正确拷贝这些对象的方法。

在Python中,变量总是一个指向对象的指针,而不是可改变的内存区域的标签:给一个变量赋一个新的值,并不是替换了原始对象,而是让这个变量去引用完全不同的一个对象。实际的效果就是对一个不支持原处修改的变量赋值,仅仅会影响那个被赋值的变量。但对于支持在原处修改的对象,共享引用时需倍加小心,因为对一个变量名的修改会影响其他的变量。

如下图:

可见,对不可变对象(数字,字符串,元组等)的共享引用,改变一个变量不会影响另一个变量

而对于可变对象(列表,字典,集合等)的共享引用,当修改一个变量所引用对象的值时,会影响到另一个变量

要想避免这种情况发生,需要拷贝对象,而不是创建引用。

Python中有很多拷贝一个列表的方法,包括内置列表函数以及标准库的copy模块等。但最常用的办法就是从头到尾分片。

但分片这种技术不能应用在字典,集合这样的核心类型上,因为它们不是序列。

复制一个字典或集合应该使用X.copy()方法:

import copy
a = copy.copy(b)
c = copy.deepcopy(d)   #深度拷贝,拷贝嵌套对象

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值