关于赋值与深浅复制

赋值

在python中,赋值语句是建立对象的引用,而不是复制对象,变量就像一个指针。例如

id函数获得的是对象的内存地址,如果两个对象内存地址一样,说明这两个对象是同一个对象,id(a) == id(b)就相当于a is b。

上述例子输出结果都一样,说明alist 和blist是一样的,指向相同的内存空间,blist是alist的一个引用。

赋值操作不会开辟新的内存地址空间,只是增加一个对象引用。由于指向的是同一片地址空间修改了alist,另一个也会改变。

浅拷贝

浅拷贝会产生新的对象,其内容是原内容的索引

浅拷贝有三种形式:切片操作,工厂函数,copy模块中的copy方法

clist 的每个元素都与alist的元素地址相同,clist的元素是alist的元素一个引用,但是clist的地址与alist不同,他们是两个不同的对象,因此修改clist理论上不会影响alist。

dlist更新了,但是alist并未更新。

但是浅拷贝之所以被称为浅拷贝,是因为它只拷贝了一层,如果list中嵌套有list,如果修改了嵌套的list情况将不一样。

输出是一样的,这是因为,修改了外层的元素会修改他的引用,让他们指向别的地址,但是修改嵌套列表中的元素,列表地址并未发生变化指向的还是同一位置。

深拷贝

深拷贝是在拷贝的基础之上,把嵌套的元素也改变了,因此他的时间和空间开销都要高,修改一个对象另一个对象并不会发生变化。

原文地址:https://www.cnblogs.com/ghming/p/8447095.html

时间: 2024-11-25 21:38:45

关于赋值与深浅复制的相关文章

详谈OC(object-c)深浅复制/拷贝-什么情况下用retain和copy

读前小提示:对于深浅复制有一个清楚的了解,对于学习oc的朋友来说,至关重要.那么首先,我们要明白深浅复制是如何定义的呢.这里为了便于朋友们理解,定义如下. 浅 复 制:在复制操作时,对于被复制的对象的每一层复制都是指针复制. 深 复 制:在复制操作时,对于被复制的对象至少有一层复制是对象复制. 完全复制:在复制操作时,对于被复制的对象的每一层复制都是对象复制. 注:1.在复制操作时,对于对象有n层是对象复制,我们可称作n级深复制,此处n应大于等于1. 2.对于完全复制如何实现(目前通用的办法是:

python——赋值与深浅拷贝

初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一--python的变量及其存储 在详细的了解python中赋值.copy和deepcopy之前,我们还是要花一点时间来了解一下python内存中变量的存储情况. 在高级语言中,变量是对内存及其地址的抽象.对于python而言,python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身.  引

OC-深浅复制

[OC学习-26]对象的浅拷贝和深拷贝——关键在于属性是否可被拷贝 对象的拷贝分为浅拷贝和深拷贝, 浅拷贝就是只拷贝对象,但是属性不拷贝,拷贝出来的对象和原来的对象共用属性,即指向同一个属性地址. 深拷贝则相当于不仅拷贝了一个对象还拷贝了它的属性,即完全是两个东西,只不过内容相同而已. 拷贝用到协议,如果这个类创建对象后,这个对象要被拷贝,那么这个类就需要用到拷贝协议,分两种:<NSCopying>和<NSMutableCopying>相当于一个是拷贝,另一个是拷贝后可修改. (1

python 深浅复制与指针内存

Python是一门很好的语言,他的优点在于拥有巨大灵活性的同时也拥有无比的严谨性,其他语言规定了很多语法,告诉你什么情况下,语法就是这样的,而Python却用很少的规定,延伸出很多语法,有些语法看上去很奇怪,仔细分析却是那么的合理.今天思考了Python中关于指针和深浅复制的问题,下面希望能通过根据内存空间的变化对这些让人头疼的问题作出一个解释. 首先看第一个例子: a = 1 b = a b = 2 print 'a = %s' %a, 'b = %s'%b 结果:a = 1 b = 2 当执

(转)(终极改良版)python基础番外——赋值与深浅拷贝

初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一--python的变量及其存储 在详细的了解python中赋值.copy和deepcopy之前,我们还是要花一点时间来了解一下python内存中变量的存储情况. 在高级语言中,变量是对内存及其地址的抽象.对于python而言,python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的只本身. 引用

Python_赋值和深浅copy

Python中赋值和深浅copy存储变化 在刚学python的过程中,新手会对python中赋值.深浅copy的结果感到丈二和尚.经过多次在网上查找这几个过程的解释说明以及实现操作观察,初步对这几个过程有了浅显的认识.以下内容仅是我在学习过程中遇到的问题,然后上网搜验证,最后理解.博文也许没有将这部分内容写明白,也许有不对的地方,如果有大佬看到希望能指点一下新人.随着后面的学习以及理解会再次补充此内容. id函数 id方法的返回值就是对象的内存地址 执行赋值语句 在python中执行一条赋值语句

深浅复制

读前小提示:对于深浅复制有一个清楚的了解,对于学习oc的朋友来说,至关重要.那么首先,我们要明白深浅复制是如何定义的呢.这里为了便于朋友们理解,定义如下. 浅 复 制:在复制操作时,对于被复制的对象的每一层复制都是指针复制. 深 复 制:在复制操作时,对于被复制的对象至少有一层复制是对象复制. 完全复制:在复制操作时,对于被复制的对象的每一层复制都是对象复制. 注:1.在复制操作时,对于对象有n层是对象复制,我们可称作n级深复制,此处n应大于等于1. 2.对于完全复制如何实现(目前通用的办法是:

Python基础(五):列表的深浅复制

首先我们需要明确列表的深浅复制是针对被嵌套的列表而言的,也就是说只有对嵌套列表我们才需要考虑这个问题.来看例子. list1=['老大','老二',['老三','老四','老五'],'老六','老七'] list2=list1.copy() print(list1,'\n',list2) #打印两个列表 print(id(list1),'\n',id(list2)) #打印两个列表的地址 print(id(list1[2]),'\n',id(list2[2])) #打印两个嵌套列表的地址 运行结

5——深浅复制、bytes和bytearray、linux用户

深浅复制 深浅复制只有在列表嵌套列表的情况下讨论 如果想保留修改之前的数据,就可以使用列表的复制,但要注意列表嵌套情况下的问题 l1 = [1,[2, 3]] l2 = l1.copy() #copy 浅复制 随着l1或l2的改变而发生改变 #浅复制只能改变第一层列表的数据,不能改变列表中嵌套的数据 ? import copy l3 = copy.deepcopy(l1) #深复制 能改变列表中所有嵌套的数据  bytes二进制序列类型 01 指定长度的零填充字节对象: [in] bytes(3