python 引用和拷贝

python 引用:
python一般内部赋值变量的话,都是传个引用变量,和C语言的传地址的概念差不多,
比如
a = [1,2,3]
表示变量a保存了这个列表的地址
python里可以用id()来查询下
a在内存的地址是:675375852
b = a
那b的内容是什么,地址又是什么呢?
用print 输出下b的内容也是[1,2,3]
然后我们查看下b的地址看下能否验证我们的结论
print id(b)
果然b的地址也是:675375852
呵呵看来结论也正确的。

这样会带来一个问题,因为变量a,和变量b都是保存了同一个列表的地址。如果我改变a指向的列表的值的话,
那b指向的列表的值也同时改变
比如:
a[1] = 6
print a
输出的内容是[1,6,3]
print b
b指向的列表的内容也是[1,6,3]


python 拷贝

如果我们只想修改a列表里面的内容。而不想修改b的内容,那就要用到python的拷贝了
a=[1,2,3]
b=a[:]###拷贝了一份a的内容给b
a[1]=6
print a
输出a的内容是[1,6,3]
而b的内容不是[1,6,3]
而是[1,2,3]

呵呵python果然好神奇阿!!


原创文章:http://www.cnpythoner.com/post/20.html,转载请保留,谢谢!

### Python 中浅拷贝与深拷贝的区别 在 Python 中,赋值操作实际上并不创建新对象;它只是让两个变量名共享同一个引用。这意味着如果通过一个名称修改了对象的内容,则另一个名称看到的对象也会相应变化。 为了真正地复制对象而不是仅仅复制其引用,`copy`模块提供了两种类型的拷贝方式: #### 浅拷贝 (Shallow Copy) 浅拷贝会创建一个新的复合对象,并将原始对象中的元素尽可能多地插入到新的对象中去。对于不可变类型的数据(如整数、字符串),这些数据会被完全复制给新对象;而对于可变容器类型(如列表、字典),则只会在新旧对象间建立一层间接关系——即它们内部存储的是相同的子对象的引用[^1]。 ```python import copy original_list = [[1, 2], [3, 4]] shallow_copied_list = copy.copy(original_list) print(shallow_copied_list is original_list) # False print(shallow_copied_list[0] is original_list[0]) # True ``` 这段代码展示了如何使用 `copy.copy()` 函数来进行浅拷贝。可以看到虽然顶层列表本身是不同的实例 (`False`) ,但内层列表仍然是同一对象(`True`) 的引用。 #### 深拷贝 (Deep Copy) 相比之下,深拷贝不仅创建了一个全新的顶级对象,还会递归地遍历并复制所有嵌套在内的子对象。因此,在任何层次上的更改都不会影响原对象或其他副本。 ```python deep_copied_list = copy.deepcopy(original_list) print(deep_copied_list is original_list) # False print(deep_copied_list[0] is original_list[0])# False ``` 这里展示的是利用 `copy.deepcopy()` 实现真正的独立副本。无论是外部还是内部结构都得到了完整的克隆,所以没有任何部分是指向相同内存地址的[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值