Python(2.7.6) copy 浅拷贝与深拷贝

Python 标准库的 copy 模块提供了对象拷贝的功能。 copy 模块中有两个函数 copy 和 deepcopy,分别支持浅拷贝与深拷贝。

copy_demo.py

import copy

class MyClass(object):
    def __init__(self, name):
        super(MyClass, self).__init__()
        self.name = name

a = [MyClass(‘huey‘)]
b = copy.copy(a)
c = copy.deepcopy(a)

print ‘a is b?‘, a is b                # a is b? False
print ‘a == b?‘, a == b                # a == b? True
print ‘a is c?‘, a is c                # a is c? False
print ‘a == c?‘, a == c                # a == c? False

a[0].name = ‘sugar‘
print ‘a[0].name =‘, a[0].name        # a[0].name = sugar
print ‘b[0].name =‘, b[0].name        # b[0].name = sugar
print ‘c[0].name =‘, c[0].name        # c[0].name = huey
时间: 2024-08-03 10:32:13

Python(2.7.6) copy 浅拷贝与深拷贝的相关文章

python中关于赋值、浅拷贝与深拷贝的问题

Python中关于对象复制有三种类型的使用方式,赋值.浅拷贝与深拷贝.他们既有区别又有联系,刚好最近碰到这一类的问题,研究下. 一.赋值 在python中,对象的赋值就是简单的对象引用,这点和C++不同.如下: list_a = [1,2,3,"hello",["python","C++"]] list_b = list_a 这种情况下,list_b和list_a是一样的,他们指向同一片内存,list_b不过是list_a的别名,是引用. 我们可

Python中的赋值、浅拷贝、深拷贝

在理解浅拷贝和深拷贝之前,首先要理解学习一下变量在Python中是怎样存储的: 变量的类型是分值引用与地址引用两种. python的一切变量都是对象,变量的存储,采用了地址引用的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身. 在Python中,是有多种数据类型:bool.int.long.float.string.list.dict.tuple.set; 其中可分为基本数据类型和复杂数据结构: 基本数据类型:bool.int.long.float.string; 复杂数据结

Python中的对象引用、浅拷贝与深拷贝

最近项目中遇到一个Python浅拷贝机制引起的bug,由于对于Python中对象引用.赋值.浅拷贝/深拷贝机制没有足够的认识,导致调试了很久才发现问题,这里简单记录一下相关概念. 在Python的设计哲学中,Python中的每一个东西都是对象,都有一个ob_refcnt变量,这个变量维护着对对象的引用计数,决定着对象的创建与消亡. 所以在Python程序中,一般的赋值操作其实只是将左值指向了右值的引用,并不会创建新的对象,可以通过id函数查看Python中对象在内存中的唯一标识,以list对象为

Python学习笔记4(浅拷贝、深拷贝)

注:此博客搬运自http://www.cnblogs.com/Eva-J/p/5534037.html,有需要的朋友希望你们去原博客观看,给予原创更多的尊重. 注:我写一遍是为加深自己的印象,备查也方便,内容可能根据自己的情况有所删减,所以还是希望你们去原博客观看,谢谢~ 1.Python的变量及其存储形式 在Python学习笔记1中我们简单提到过变量这个概念,那么现在简单理解一下变量具体是如何存储数据的. Python采用了引用语义的方式存储变量,存储的内容只是这个变量的值所在的内存地址,而不

python中的赋值、浅拷贝和深拷贝

1.对于不可变数据类型来说,没有深浅拷贝之分,这些操作都是将变量指向同一个地址空间,两者的id一样,如果对其重新赋值,也只是重新创建了一个对象,替换掉旧的. 2.对于可变数据类型来说 2.1 赋值 两者完全指向相同的地址空间id()一样,可变数据类型的改变会导致两者都改变. a = [1,2,3,4,[33,44,55]] c = a print(id(a),id(c)) print(a,c) a[0]="改变" print(a,c) 结果 2352692648520 23526926

Python之美[从菜鸟到高手]--浅拷贝、深拷贝完全解读(copy源码分析)

可悲的我一直以为copy模块是用C写的,有时候需要深入了解deepcopy,文档描述的实在太简单,还是不知所云. 比如说最近看sqlmap源码中AttribDict的_deepcopy__有些疑惑, def __deepcopy__(self, memo): retVal = self.__class__() memo[id(self)] = retVal for attr in dir(self): if not attr.startswith('_'): value = getattr(se

python之copy模块与深拷贝、浅拷贝

copy模块 使用copy模块来实现复制功能. 复制方法分为浅拷贝与深拷贝: 浅拷贝, copy.copy(object) 对内存地址进行复制,目标对象和源对象指向同一内存片内存空间. 深拷贝, copy.deepcopy(object) 为复制生成的对象也申请一个单独的内存空间,内存地址是自主分配的. 完成复制后,目标对象和源对象虽然存储数据是一样的,但是内存地址不同. 两个对象互不干涉. 例: >>> jack = ['jack', ['age', '20']]>>>

一入python深似海--浅拷贝与深拷贝

python中有一个模块copy,deepcopy函数用于深拷贝,copy函数用于浅拷贝.要理解浅拷贝,必须先弄清楚python中的引用. 引用 Python中一切都是对象,变量中存放的是对象的引用.这是一个普遍的法则.可以说 Python 没有赋值,只有引用.如,a=1,变量a只是整数对象1的引用. 可变对象与不可变对象及其引用 一.不可变对象 不可变对象包括:数字,字符串,元组. 由于Python中的变量存放的是对象引用,所以对于不可变对象而言,尽管对象本身不可变,但变量的对象引用是可变的.

Python中赋值、浅拷贝与深拷贝

python中关于对象复制有三种类型的使用方式,赋值.浅拷贝与深拷贝.他们既有区别又有联系,刚好最近碰到这一类的问题,研究下. 一.赋值 在python中,对象的赋值就是简单的对象引用,这点和C++不同.如下: list_a = [1,2,3,"hello",["python","C++"]] list_b = list_a 这种情况下,list_b和list_a是一样的,他们指向同一片内存,list_b不过是list_a的别名,是引用. 我们可