美文网首页
3 默认做浅复制

3 默认做浅复制

作者: 燕城白夜 | 来源:发表于2019-04-09 21:00 被阅读0次

在Python中复制list或其他可变集合时,使用的类型构造方法或切片默认的都是浅复制,也就是说对于对象中的对象只是复制了一个地址,如下。

如果在容器中有可变对象的引用可能会造成无法预期的结果。

+=运算符对于list来说会原地修改list的内容, 对于tuple来说则会重新创建一个对象并赋值给原引用变量。

为任意对象做浅复制和深复制

有些时候我们可能也需要深复制(即副本不共享内部对象的引用),我们可以使用copy模块提供的copy、deepcopy函数,他能为任意对象做浅复制和深复制。

函数参数作为引用时:

这种情况下函数形参为实参(引用类型)的副本,函数可能会修改作为参数传入的引用指向的对象,但不能将这个对象替换。

使用可变类型作为参数默认值引起的问题:

没有初始化的默认参数会指向同一个对象。

出现这个问题的根源是参数默认值会在函数对象定义时计算(通常在加载模块时),因此参数默认值成为了函数对象的属性,当这个默认值为可变类型时就容易出现我们意料之外的事情。

我们观察上述例子中t函数对象的__default__属性:

我们每次调用t这个函数对象时,其实是共享了这个函数对象的默认值,对于值为可变类型的参数来说每次调用实际上操作的是同一个对象,对于上述例子来说每次调用时l默认都只是t函数对象__defaults__属性(包含有个或多个默认值)中某一个元素的别名而已。

具体请看下面的例子:

这也是我们为什么会将函数参数的默认值设置为None。

相关文章

  • 3 默认做浅复制

    在Python中复制list或其他可变集合时,使用的类型构造方法或切片默认的都是浅复制,也就是说对于对象中的对象只...

  • Python 浅复制与深复制

    《流畅的 Python》8.3 默认做浅复制 读书笔记 复制列表对象时,如果列表对象中包含其他列表对象,那么应该复...

  • 浅默

    (原创) 风的温婉 吹散了弥漫空气的花香 雨的清冷 冲刷着潜藏已久的落叶 看!晴天娃娃在雨里讪笑 勇气还在,等待风...

  • 浅默

    来自孤芳 来自彷徨 来自眸间 以看不清虚实 以化落为空矿 搁下的青春三分三幕 余下的年华半醒半醉 几多淡然...

  • 浅默

    净白之年,静沐清风

  • JS深浅拷贝

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

  • js之深拷贝、浅拷贝

    浅拷贝 对于基本类型,浅拷贝是对值的复制,对于对象来说,浅拷贝只复制指向某个对象的指针,而不复制对象本身,并没有开...

  • python中的浅拷贝和深拷贝

    浅拷贝和深拷贝: 浅拷贝 shallow copy 浅拷贝是指在对象复制过程中,只复制一层变量,不会复...

  • 浅|深 复制

    浅复制 //只写main函数 //结果是 我们可以看到一旦pointArray1发生了改变pointArray2也...

  • Java 中的深拷贝与浅拷贝

    一、浅拷贝 浅拷贝指的是按位复制对象属性,对于引用类型属性复制引用,对于基本类型属性则复制数据。 我们通过下面的例...

网友评论

      本文标题:3 默认做浅复制

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