美文网首页
Python 引用、浅复制和深复制

Python 引用、浅复制和深复制

作者: AcerYoung | 来源:发表于2019-05-12 13:55 被阅读0次

和python 相处了1年多,python 确实是一门非常方便的语言。
在python中,一切皆对象。

python 引用

先来看一个例子

a={1:{2:3}}
b=a
b[1][2]=4
print("b=%s a=%s"%(b,a))

输出结果

b={1:{2:4}} a={1:{2:4}} 

即 修改了b,a的值也被修改了
这是因为在python中,b 和 a 指向相同的地址空间,b并不是一个新的对象,所以改变b的值也会改变a的值。
这种设计的方便在于,只需修改函数返回出的对象的值就可以同步修改到原来的值,不需要去追溯到原来的值。(个人经验)

python 浅复制

a={1:{2:3}}
b=copy.copy(a)
c=copy.copy(a)
b[1]=4
print("b=%s a=%s"%(b,a))
c[1][2]=4
print("b=%s c=%s"%(b,c))

输出结果

b={1:4} a={1:{2:3}} 
b={1:{2:4}} c={1:{2:4}} 

即 b 其实复制的是a 的引用 并不是复制整个a的值
当a 含有子对象时且为可变对象时,修改b的子对象其实也就是在修改a的子对象,即b的子对象其实就是a的子对象。
因而对于可变对象而言,浅复制并不是完全复制,完全复制一份新的对象需要用到深复制。

python 深复制

a={1:{2:3}}
b=copy.deepcopy(a)
c=copy.deepcopy(a)
b[1]=4
print("b=%s a=%s"%(b,a))
c[1][2]=4
print("b=%s c=%s"%(b,c))

输出结果

b={1:4} a={1:{2:3}} 
b={1:{2:4}} c={1:{2:3}} 

总结

很多时候遇到的坑其实是因为在平时没有去思考为什么导致的。

参考链接:

http://wsfdl.com/python/2013/08/16/%E7%90%86%E8%A7%A3Python%E7%9A%84%E6%B7%B1%E6%8B%B7%E8%B4%9D%E5%92%8C%E6%B5%85%E6%8B%B7%E8%B4%9D.html

相关文章

  • iOS全解11:特殊问题

    1、浅拷贝和深拷贝的区别? 浅拷贝:只复制指向对象的指针,指针指向同一个地址,而不复制引用对象本身。深拷贝:复制引...

  • Python 引用、浅复制和深复制

    和python 相处了1年多,python 确实是一门非常方便的语言。在python中,一切皆对象。 python...

  • JS深浅拷贝

    浅拷贝 浅拷贝的意思就是只复制引用,而未复制真正的值。 深拷贝 深拷贝就是对目标的完全拷贝,不像浅拷贝那样只是复制...

  • objective深浅拷贝

    浅复制和深复制的区别? 浅复制:只复制指向对象的指针,而不复制引用对象本身。 深复制:复制引用对象本身。 意思就是...

  • 面试题iOS

    面试blog 1、深拷贝浅拷贝:浅拷贝就是拷贝对象的指针,而不复制引用对象本身;深拷贝就是拷贝引用对象本身;浅复制...

  • JAVA 深拷贝 浅拷贝

    JAVA 深拷贝 浅拷贝 浅拷贝只是复制了引用, 这个引用还是指向原来的值 深拷贝那就是直接复制了整个Object...

  • 浅拷贝、深拷贝 生成器 迭代器

    Python中的赋值(复制)、浅拷贝、深拷贝之间的区别 1.赋值: 只是复制了新对象的引用,不会开辟新的内存空间...

  • js中的深拷贝和浅拷贝

    一、深拷贝与浅拷贝 深拷贝和浅拷贝只针对Object,Array这些复杂的引用对象。浅拷贝,只复制对象的引用的地址...

  • 深拷贝与浅拷贝的区别,实现深拷贝的方法

    深复制和浅复制最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用。深拷贝和浅拷贝是只针对Object和...

  • iOS常见面试题

    1、浅复制和深复制的区别 浅层复制:只复制指向对象的指针,而不复制引用对象本身。 深层复制:复制引用对象本身。 意...

网友评论

      本文标题:Python 引用、浅复制和深复制

      本文链接:https://www.haomeiwen.com/subject/qvxcaqtx.html