扫码关注官方订阅号
如题,自学 Python 中。在学习生成器一节时准备用生成器产生一个杨辉三角。代码如下:
功能实现了,之后“突发奇想”的把第七行的 [:] 删除试一下,于是得到了这个结果:
[:]
所以我想问一下, L1=L 与 L1=L[:] 相比,有什么区别呢?为什么第二次会得到这样的结果?
L1=L
L1=L[:]
有个知识点首先要清楚,对象的引用,浅拷贝,深拷贝的区别。
import copy l = [1, 2, 3, [4, 5]] l1 = l l2 = l[:] l3 = copy.deepcopy(l) print 'l:%d, l1:%d, l2:%d, l3:%d' % (id(l), id(l1), id(l2), id(l3)) # 输出: l:39121992, l1:39121992, l2:39142344, l3:39142216 l3[3][0] = 6 print l # 输出: [1, 2, 3, [4, 5]] l2[3][0] = 6 print l # 输出: [1, 2, 3, [6, 5]]
l1引用了l,他们是同一个对象,只是变量名不一样,可理解为l1是l的另外一个名字。所以他们打印的id都一样,修改了l1里的东西,其实也就是在修改l。l2和l3分别是浅拷贝和深拷贝了l对象,l2和l3都是新的对象,所以他们都有新的id。修改他们的非可变对象(如数字,字符串,元组)时,不会影响到l。深拷贝和浅拷贝区别:浅拷贝中可变对象(如列表,字典类型),仍是引用的原对象l中的对象,所以修改了浅拷贝中的[4, 5],l也受影响了;但是修改深拷贝中的[4, 5],l未受影响,因为深拷贝中可变对象也是新拷贝的。
复制和引用的问题,l1=L[:]不会随着L改变而改变,但是l1=L,如果L.pop(), 那个l1也会变
In [1]: l = [1, 3, 4] In [2]: l1 = l In [3]: l.pop() Out[3]: 4 In [4]: l Out[4]: [1, 3] In [5]: l1 Out[5]: [1, 3] In [6]: l2 = l1[:] In [7]: l.pop() Out[7]: 3 In [8]: l Out[8]: [1] In [9]: l1 Out[9]: [1] In [10]: l2 Out[10]: [1, 3]
相关问题, 你可以去看看https://www.zhihu.com/questio...
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
有个知识点首先要清楚,对象的引用,浅拷贝,深拷贝的区别。
l1引用了l,他们是同一个对象,只是变量名不一样,可理解为l1是l的另外一个名字。所以他们打印的id都一样,修改了l1里的东西,其实也就是在修改l。
l2和l3分别是浅拷贝和深拷贝了l对象,l2和l3都是新的对象,所以他们都有新的id。修改他们的非可变对象(如数字,字符串,元组)时,不会影响到l。
深拷贝和浅拷贝区别:浅拷贝中可变对象(如列表,字典类型),仍是引用的原对象l中的对象,所以修改了浅拷贝中的[4, 5],l也受影响了;但是修改深拷贝中的[4, 5],l未受影响,因为深拷贝中可变对象也是新拷贝的。
复制和引用的问题,l1=L[:]不会随着L改变而改变,但是l1=L,如果L.pop(), 那个l1也会变
相关问题, 你可以去看看
https://www.zhihu.com/questio...