添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在阐述引用、浅拷贝和深拷贝前,首先需要要了解 Python 的世界里,一切皆对象,每个对象各包含一个 idendity、type 和 value。如下图所示,id 、type 均为不可变的;value即可为可变的,也可为不可变的。

1、引用 (Reference)

>>> b = [1 , 2]
>>> a = [b, 3, 4]
>>> c = a  # c = a 表示 c 和 a 指向相同的地址空间,并没有创建新的对象。 
>>> print(c)
[[1, 2], 3, 4]
>>> id(a)
4408148552
>>> id(c)
4408148552

2、浅拷贝(Shallow Copy)

d = copy.copy(a) 是浅拷贝~~~虽然它有两个copy...等价于 d = a.copy()
浅拷贝只会拷贝父对象,不会拷贝父对象中的子对象,所以若a的子对象变,则d变;但是父对象变,d不会改变。

>>> import copy
>>> d = copy.copy(a)  # 创建了一个新对象,复制了原有对象的引用
>>> print(d)
[[1, 2], 3, 4]
>>> id(d)  # d 和 a 的地址不一样
4408199792
>>> id(a)
4408148552
>>> id(a[0])  # a[0] 和 d[0]地址一样,即子对象地址一样
4408022944
>>> id(d[0])
4408022944
>>> d[0][0] = 5 #子对象改变,则两者都改变
>>> print(d)
[[5, 2], 3, 4]
>>> print(a)   # 由于a[0] 和 d[0]地址一样,则改变 d[0][0]的值,对a[0][0]有影响。
[[5, 2], 3, 4]
>>>id(a[1])  # a[1] 和 d[1]地址不一样
1997107680
>>>id(d[1])
1997106720
>>> a[1] = 33  # 父对象的改变,d不会改变
>>> print(a)
[[5, 2], 33, 4]
>>> print(d)  # 由于a[1] 和 d[1]地址不一样,则改变 a[1]的值,对 d[1]无影响。
[[5, 2], 3, 4]

深拷贝创建一个新对象,对于对象中的元素,深拷贝都会重新生成一份,而不是简单的使用原始元素的引用。

# e = copy.deepcopy(a) 新建了一个新对象,完整的在内存中复制原有对象
>>> e = copy.deepcopy(a)  
>>> print(e)
[[1, 2], 3, 4]
>>> id(a)  # e 和 a 的地址不一样
4408148552
>>> id(e)
4408394792
>>> id(a[0])  # e[0] 和 a[0] 的地址不一样
4408022944
>>> id(e[0])
4408398432
>>> e[0][0] = 5
>>> print(e)  # 由于e[0] 和 a[0] 的地址不一样,则改变 e[0] 的值不会改变 a[0] 的值
[[5, 2], 3, 4]
>>> print(a)
[[1, 2], 3, 4]

关于浅拷贝和深拷贝的区别,Python 的 document是这样解释的:

The difference between shallow and deep copying is only relevant for compound objects (复合对象)(objects that contain other objects, like lists or class instances):

  • A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.
  • A deep copy constructs a new compound object and then, recursively(递归地), inserts copies into it of the objects found in the original.
在阐述引用、浅拷贝和深拷贝前,首先需要要了解 Python 的世界里,一切皆对象,每个对象各包含一个 idendity、type 和 value。如下图所示,id 、type 均为不可变的;value即可为可变的,也可为不可变的。1、引用 (Reference)>>> b = [1 , 2]>>> a = [b, 3, 4]>&g...
Python语言参考描述了 Python 语言的具体语法和语义,这份库参考则介绍了与 Python 一同发行的标准库。它还描述了通常包含在 Python 发行版中的一些可选组件。 Python 标准库非常庞大,所提供的组件涉及范围十分广泛,正如以下内容目录所显示的。这个库包含了多个内置模块 (以 C 编写),Python 程序员必须依靠它们来实现系统级功能,例如文件 I/O,此外还有大量以 Python 编写的模块,提供了日常编程中许多问题的标准解决方案。其中有些模块经过专门设计,通过将特定平台功...
Python学习之变量、对象和引用 文章目录Python学习之变量、对象和引用问题的引出变量创建变量类型变量使用动态类型类型属于对象,而不是变量对象的垃圾收集参考资料 问题的引出 当在Python中运行赋值语句a=3时,熟悉C语言的朋友肯定会感到奇怪:难道变量a不需要定义吗?Python是怎么知道变量a的类型的? 一个变量(也就是变量名),就像a,当代码第一次给它赋值的时候就创建了它。之...
[size=large][b]References[/b][/size] 当你创建对象并把它赋给一个变量后,这个变量仅仅只是关联到(refer to)这个对象,而并不代表这个对象本身。这就意味着变量名指向了你的计算机的内存中对象保存的位置。这个叫做把变量名绑定到对象上(This is called as binding of the name to the object)。 通常你并不需要太关...
Python Essential Reference(4th) 英文无水印pdf 第4版 pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
目录 导语浅谈变量、对象及引用间的关系引用(reference)可变对象与不可变对象的引用问题浅拷贝(shallow copy)后记参考文章 挺绕的知识点,自己边看别人的博客边整理自己遇到的问题,磕磕绊绊写下这篇博客,有错误欢迎在评论区指出 浅谈变量、对象及引用间的关系 变量 :变量可以看作是一个标签,它无类型,建立后存入系统变量表 引用引用可以看作是一个特殊的"指针",它存放着对象...
深拷贝浅拷贝都是在复制对象时使用的技术。 浅拷贝复制对象的引用,而不是对象本身。这意味着,如果原始对象中的某个属性更改了,那么拷贝对象中的相应属性也会更改。浅拷贝通常使用对象的 clone() 方法来实现。 深拷贝则是复制对象及其所有属性的副本。这意味着,如果原始对象中的某个属性更改了,那么拷贝对象中的相应属性不会更改。深拷贝通常使用对象的 serialize() 和 unserialize() 方法来实现。 以下是深拷贝浅拷贝的示例代码: // 浅拷贝 class ShallowCopy { constructor(obj) { this.obj = obj; clone() { return Object.assign({}, this.obj); // 深拷贝 class DeepCopy { constructor(obj) { this.obj = obj; clone() { return JSON.parse(JSON.stringify(this.obj)); 请注意,这只是示例代码,实际应用中可能需要根据对象的类型和属性进行适当的修改。
CSDN-Ada助手: 非常感谢博主的分享,这篇博客写得非常好!标题简洁明了,内容也条理清晰,让人一目了然。作为一个对数据库课程感兴趣的学生,这篇博客对我来说非常有启发性。希望博主能够继续分享更多知识,让我们受益匪浅。再次感谢博主的辛勤付出! 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。 tf.nn.max_pool(value, ksize, strides, padding, name=None)池化操作 Fear is not real: 你知道你问了些什么么? tf.nn.max_pool(value, ksize, strides, padding, name=None)池化操作 Jeremmey: 你知道你写了些什么么? VScode出现 Build failed,do you want to contine? Source:Debugger for java (Extension) sanhu89: Open the command palette (F1) select Java: Clean the Java Language Server Workspace select Restart and delete from the confirmation prompt 负数原码与补码之间相互转换 m0_73876754: 正数的原码反码补码相同