t = [1,["a","b"]]

t_bak = t
t_cop = copy.copy(t)
t_deep = copy.deepcopy(t)
print("id(t)---  "+str(id(t))+"    id(t[1])   " +str(id(t[1])) +"    id(t[1][1] 也就是 内部列表中的第二个元素"+str(id(t[1][1])))
print("id(t_bak)--- "+str(id(t_bak))+" id(t_bak[1]) " +str(id(t_bak[1])) +" id(t_bak[1][1] 也就是 内部列表中的第二个元素"+str(id(t_bak[1][1])))
print("id(t_copy)--- "+str(id(t_cop))+" id(t_cop[1]) " +str(id(t_cop[1])) +" id(t_cop[1][1] 也就是 内部列表中的第二个元素"+str(id(t_cop[1][1])))
print("id(t_deep)--- "+str(id(t_deep))+" id(t_deep[1]) " +str(id(t_deep[1])) +" id(t_deep[1][1] 也就是 内部列表中的第二个元素"+str(id(t_deep[1][1])))
id(t)---  140706556438648    id(t[1])   140706556410336    id(t[1][1] 也就是 内部列表中的第二个元素140706557474336
id(t_bak)--- 140706556438648 id(t_bak[1]) 140706556410336 id(t_bak[1][1] 也就是 内部列表中的第二个元素140706557474336
id(t_copy)--- 140706534860560 id(t_cop[1]) 140706556410336 id(t_cop[1][1] 也就是 内部列表中的第二个元素140706557474336
id(t_deep)--- 140706556438576 id(t_deep[1]) 140706556439656 id(t_deep[1][1] 也就是 内部列表中的第二个元素140706557474336

可以看到, tt_bak 这种直接赋值的操作,其实指向的是同一个对象,无论是第一层,还是内部嵌套的元素

tt_cop 这种copy操作,第一层的id已经不一样了,说明他们创建了新的对象,但是内部嵌套的元素还是一致的,说明给他们内部嵌套指向的是同一个对象。

再说 tt_deep 这种deepcopy 深拷贝操作,发现,第一层已经不一样了,说明创建了新的对象,但是内部嵌套的元素还是一样的

修改t_bak(1)

t_bak.append("3")
print(t) #[1, ['a', 'b'], '3']
print(t_bak)#[1, ['a', 'b'], '3']
print(t_cop)#[1, ['a', 'b']]
print(t_deep)#[1, ['a', 'b']] print("id(t)--- "+str(id(t))+" id(t[1]) " +str(id(t[1])) +" id(t[1][1] 也就是 内部列表中的第二个元素"+str(id(t[1][1])))
print("id(t_bak)--- "+str(id(t_bak))+" id(t_bak[1]) " +str(id(t_bak[1])) +" id(t_bak[1][1] 也就是 内部列表中的第二个元素"+str(id(t_bak[1][1])))
print("id(t_copy)--- "+str(id(t_cop))+" id(t_cop[1]) " +str(id(t_cop[1])) +" id(t_cop[1][1] 也就是 内部列表中的第二个元素"+str(id(t_cop[1][1])))
print("id(t_deep)--- "+str(id(t_deep))+" id(t_deep[1]) " +str(id(t_deep[1])) +" id(t_deep[1][1] 也就是 内部列表中的第二个元素"+str(id(t_deep[1][1])))
id(t)---  139789718802088    id(t[1])   139789718801728    id(t[1][1] 也就是 内部列表中的第二个元素139789719836192
id(t_bak)--- 139789718802088 id(t_bak[1]) 139789718801728 id(t_bak[1][1] 也就是 内部列表中的第二个元素139789719836192
id(t_copy)--- 139789697222416 id(t_cop[1]) 139789718801728 id(t_cop[1][1] 也就是 内部列表中的第二个元素139789719836192
id(t_deep)--- 139789718802232 id(t_deep[1]) 139789718802376 id(t_deep[1][1] 也就是 内部列表中的第二个元素139789719836192

修改 t_bak(2)

t_bak[1][1]='c'
print(t) #[1, ['a', 'c'],]
print(t_bak)#[1, ['a', 'c']]
print(t_cop)#[1, ['a', 'c']]
print(t_deep)#[1, ['a', 'b']] id(t)--- 140085180813112 id(t[1]) 140085180812968 id(t[1][1] 也就是 内部列表中的第二个元素140085181848632
id(t_bak)--- 140085180813112 id(t_bak[1]) 140085180812968 id(t_bak[1][1] 也就是 内部列表中的第二个元素140085181848632
id(t_copy)--- 140085159233296 id(t_cop[1]) 140085180812968 id(t_cop[1][1] 也就是 内部列表中的第二个元素140085181848632
id(t_deep)--- 140085180813040 id(t_deep[1]) 140085180812536 id(t_deep[1][1] 也就是 内部列表中的第二个元素140085181847072

这也证明了上述:

浅拷贝创建了一个新的对象,但是内部嵌套的元素仍然和原对象引用的是同一个。

深拷贝,无论内外都重新复制了一份

修改 t_cop


t_cop.append(4)
t_cop[1][1] = 'd'
print(t) #[1, ['a', 'd']]
print(t_bak)##[1, ['a', 'd']]
print(t_cop)#[1, ['a', 'd'], 4]
print(t_deep)#[1, ['a', 'b']] print("id(t)--- "+str(id(t))+" id(t[1]) " +str(id(t[1])) +" id(t[1][1] 也就是 内部列表中的第二个元素"+str(id(t[1][1])))
print("id(t_bak)--- "+str(id(t_bak))+" id(t_bak[1]) " +str(id(t_bak[1])) +" id(t_bak[1][1] 也就是 内部列表中的第二个元素"+str(id(t_bak[1][1])))
print("id(t_copy)--- "+str(id(t_cop))+" id(t_cop[1]) " +str(id(t_cop[1])) +" id(t_cop[1][1] 也就是 内部列表中的第二个元素"+str(id(t_cop[1][1])))
print("id(t_deep)--- "+str(id(t_deep))+" id(t_deep[1]) " +str(id(t_deep[1])) +" id(t_deep[1][1] 也就是 内部列表中的第二个元素"+str(id(t_deep[1][1])))
id(t)---  140596834620840    id(t[1])   140596834621920    id(t[1][1] 也就是 内部列表中的第二个元素140596835776312
id(t_bak)--- 140596834620840 id(t_bak[1]) 140596834621920 id(t_bak[1][1] 也就是 内部列表中的第二个元素140596835776312
id(t_copy)--- 140596813072144 id(t_cop[1]) 140596834621920 id(t_cop[1][1] 也就是 内部列表中的第二个元素140596835776312
id(t_deep)--- 140596834620912 id(t_deep[1]) 140596834651312 id(t_deep[1][1] 也就是 内部列表中的第二个元素140596835685920

修改 t_deep

t_deep.append(5)
t_deep[1][1] = 'e' print(t) #[1, ['a', 'b']]
print(t_bak)#[1, ['a', 'b']]
print(t_cop)#[1, ['a', 'b']]
print(t_deep)#[1, ['a', 'e'], 5] print("id(t)--- "+str(id(t))+" id(t[1]) " +str(id(t[1])) +" id(t[1][1] 也就是 内部列表中的第二个元素"+str(id(t[1][1])))
print("id(t_bak)--- "+str(id(t_bak))+" id(t_bak[1]) " +str(id(t_bak[1])) +" id(t_bak[1][1] 也就是 内部列表中的第二个元素"+str(id(t_bak[1][1])))
print("id(t_copy)--- "+str(id(t_cop))+" id(t_cop[1]) " +str(id(t_cop[1])) +" id(t_cop[1][1] 也就是 内部列表中的第二个元素"+str(id(t_cop[1][1])))
print("id(t_deep)--- "+str(id(t_deep))+" id(t_deep[1]) " +str(id(t_deep[1])) +" id(t_deep[1][1] 也就是 内部列表中的第二个元素"+str(id(t_deep[1][1])))
id(t)---  140579373325560    id(t[1])   140579373295088    id(t[1][1] 也就是 内部列表中的第二个元素140579374360096
id(t_bak)--- 140579373325560 id(t_bak[1]) 140579373295088 id(t_bak[1][1] 也就是 内部列表中的第二个元素140579374360096
id(t_copy)--- 140579351746320 id(t_cop[1]) 140579373295088 id(t_cop[1][1] 也就是 内部列表中的第二个元素140579374360096
id(t_deep)--- 140579373325488 id(t_deep[1]) 140579373326136 id(t_deep[1][1] 也就是 内部列表中的第二个元素140579374451928

最新文章

  1. tp框架之验证码
  2. MVC缓存
  3. python pip install
  4. ember.js:使用笔记6 子项目的前进与后退
  5. 慕课网-安卓工程师初养成-4-8 Java循环语句之 do...while
  6. 代码审查 Code Review
  7. 泛泰A850 (高通8064+720p)刷4.4专用中文recovery TWRP2.7.1.3版
  8. Partition List -- LeetCode
  9. objective-c之各种数值
  10. PHP date()函数格式与用法汇总
  11. 关于node的前端项目编译时内存溢出问题
  12. 使用非直接缓冲区与直接缓冲区进行文件的复制(基于Channel)
  13. Linux - 修改系统的max open files、max user processes (附ulimit的使用方法)
  14. vivado place30-378
  15. OGNL中的#、%和$符号的用法
  16. R8500 MPv2 版本 刷梅林改版固件
  17. (转)yuicompressor 与 maven结合,打包,压缩js,css (一)
  18. hashCode和identityHashCode底层是怎么生成的
  19. HTML5:'data-'属性的作用是什么
  20. WPF的ItemsControl设置数据源以及Binding使用

热门文章

  1. Koa快速入门教程(一)
  2. jQuery对象的操作
  3. 用户禁止cookie后,如何继续使用session
  4. 微信小程序中使用iconfont/font-awesome等自定义字体图标
  5. mysql中的sql_mode
  6. Vue.js基础(一)
  7. fabric默认样例的分析
  8. gentoo eclipse swt
  9. Ruby学习笔记1 -- 基本语法和数据类型, Class
  10. 32.纯 CSS 创作六边形按钮特效