Python中的对象分为可变与不可变,有必要了解一下,这会影响到python对象的赋值与拷贝。而拷贝也有深浅之别。不可变对象简单说就是某个对象存放在内存中,这块内存中的值是不能改变的,变量指向这块内存,如果要改变变量的值,只能再开辟一块内存,放入新值,再让变量指向新开辟的内存。#定义三个变量
f=22
n=22
z=f
print(‘f=%s,n=%s,z=%s‘ %(f,n,z))
print(‘f的地址:‘,id(f))#id用于获取变量内存地址print(‘n的地址:...
在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用一般有三种方法,alist=[1,2,3,["a","b"]] (1)直接赋值,传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变>>> b=alist>>> print b[1, 2, 3, [‘a‘, ‘b‘]]>>> alist.append(5)>>> print alist;print b[1, 2, 3, [‘a‘, ‘b‘], 5][1, 2, 3, [‘a‘, ‘b‘], 5](2)...
浅拷贝,list值是可变的,str值不可变,只能重新赋值a=b=c=‘wjx‘print(a,b,c)c= ‘jmy‘#重新赋值了,所以内存分配了新的地址print(a,b,c)print(id(a))print(id(b))print(id(c)) # 浅拷贝:# a与b的指向的是一个内存地址,这个内容地址中存放着a与b的值,所以当a中元素变了,b的也跟着变了a=b=[1,2,3]a[2]=8b.append(4)print(a,b)#深拷贝:a和b是分配了两块内存地址的,所以互不影响import copya1=[13,[4,5,6]]b1=copy.deepcopy(...
copy模块使用copy模块来实现复制功能。复制方法分为浅拷贝与深拷贝: 浅拷贝, copy.copy(object) 对内存地址进行复制,目标对象和源对象指向同一内存片内存空间。 深拷贝, copy.deepcopy(object) 为复制生成的对象也申请一个单独的内存空间,内存地址是自主分配的。 完成复制后,目标对象和源对象虽然存储数据是一样的,但是内存地址不同。 两个对象互不干涉。例:>>> jack = [‘jack‘, [‘age‘, ‘20‘]]>>> import cop...
1.首先,对被操作对象分类,对于不可变对象而言,如字符串、数字、tuple等,这三种操作是等价的,都是引用import copya=‘apple‘b=ac=copy.copy(a)d=copy.deepcopy(a)print(id(a))print(id(b))print(id(c))print(id(d) 输出:1840734496184073449618407344961840734496可见,这四个变量都指向同一块内存地址,即‘apple‘这个字符串所在的地址2.对可变对象(或者叫做容器对象),如[],{},类实例等,赋值依然是引用;浅拷贝则会新生...
浅拷贝可以拿丈夫与媳妇公用一张银行卡来举例 # python
>>> husband = [‘liang‘,123,[10000,6000]] #丈夫的银行卡信息(姓名,id,额度,余额)
>>> wife = husband.copy() #媳妇和丈夫公用一张银行卡(姓名与id不同,但是额度与余额相同)
>>> wife[0] = ‘yue‘
>>> wife[1] = 456
>>> wife[2][1] -= 3000 #媳妇花费3000
>>> wife
[‘yue‘, 456, [10000, 3000]] #显示媳妇余额
>>> husband
[‘...
0.说明 先看看浅拷贝的概念:浅拷贝:对一个对象进行浅拷贝其实是新创建了一个类型跟原对象一样,其内容还是原来对象元素的引用,换句话说,这个拷贝的对象本身是新的,但是它的内容不是 序列类型对象的浅拷贝是默认类型拷贝,有以下几种实现方式:完全切片操作:下面操作会有利用工厂函数:比如list()、dict()等使用copy模块的copy()函数 其实如果是真正理解了Python对象或者说理解了可变对象和不可变对象,...
1. 例子(1)原对象(b1)可变1 >>> import copy
2 >>> a1 = [1, 2, 3]
3 >>> a2 = 4
4 >>> b1 = [a1, a2]
5 >>> b2 = copy.copy(b1) # 浅拷贝6 >>> b3 = copy.deepcopy(b1) # 深拷贝最外层对象的地址:浅拷贝和深拷贝都改变了1 >>> id(b1)
2 1664414246280
3 >>> id(b2)
4 1664414248328
5 >>> id(b3)
6 16644142479441 >>> b1.append(5)
2 >>> b1
3 [[1, 2, 3], 4, 5]
4 >>> b2
5 [[1, 2, 3], 4]
6 >>> b3
7 [[1, 2, 3], 4...
直接赋值:其实就是对象的引用(别名)。浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。1.赋值python与C语言不同,在C语言中,直接将一个元素赋值给另一个元素,相当于是产生了一份副本,两者的值相同,但是存放在不同地址,后续对两者分别操作也是互不干扰的。而在python中,将一个元素赋值给另一个元素,相当于是将它的地址赋给了第二个元...
1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。(比深拷贝更加节省内存)
2. copy.deepcopy 深拷贝 拷贝对象及其子对象
小例子:import copy
a = [1, 2, 3, 4, [‘a‘, ‘b‘, ‘c‘]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
print(id(a))#2552169009288
print(id(b))#2552169009288
print(id(c))#2552169010568
print(id(d))#2552169010504
很容易理解:a是一个列表,表内元素a[4]也是一个列表(也就是一个...
1 深拷贝浅拷贝1.1 删除奇数1 l1 = [1,1,1,1,2,3,4,5]
2 l2 = l1 #浅拷贝, l和l2实际指向同一个内存地址3print(id(l1)) #查看内存地址4print(id(l2))
5for i in l2:
6if i%2!=0:
7 l1.remove(i) #删除奇数8print(l1) #循环删list的时候,会导致下标错位,结果是不对的运行结果如下:4200116042001160[1, 1, 2, 4]1.2 浅拷贝import copy
l1 = [1,1,1,1,2,3,4,5]
l2 = l1 #浅拷贝, l和l2实际指向同一个内存地址
l3 = l1.co...
本篇文章给大家带来的内容是关于Python中赋值&浅拷贝&深拷贝的简单介绍(示例) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。在写dict数据类型时,有提到过“赋值语句”与copy()函数。其实说到深浅拷贝,需要考虑具体的数据类型。一部分是不可变对象,如数字、字符串;另一部分是可变对象,如列表、字典等一、定义解释变量:一个系统表的元素,指向对象的连接空间。对象:被分配的一块内存,存储其实际的值。...
这礼拜碰到一些问题,然后意识到基础知识一段时间没巩固的话,还是有遗忘的部分,还是需要温习,这里做份笔记,记录一下前续先简单描述下碰到的题目,要求是写出2个print的结果可以看到,a指向了一个列表list对象,在Python中,这样的赋值语句,其实内部含义是指a指向这个list所在内存地址,可以看作类似指针的概念。而b,注意,他是把a对象包裹进一个list,并且乘以5,所以b的样子应该是一个大list,里面元素都是a而当a对象进行了...
在讲什么是深浅拷贝之前,我们先来看这样一个现象:a = [scolia, 123, [], ]
b = a[:]
b[2].append(666)
print a
print b为什么我只对b进行修改,却影响到了a呢?看过我在之前的文章中就说过:序列中保存的都是内存的引用。所以,当我们通过b去修改里面的空列表的时候,其实就是修改内存中的同一个对象,所以会影响到a。a = [scolia, 123, [], ]
b = a[:]
print id(a), id(a[0]), id(a[1]), id(a[2])
print id(b), id(b[0]), id(b[...
1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。2. copy.deepcopy 深拷贝 拷贝对象及其子对象一个很好的例子:import copy
a = [1, 2, 3, 4, [a, b]] #原始对象b = a #赋值,传对象的引用
c = copy.copy(a) #对象拷贝,浅拷贝
d = copy.deepcopy(a) #对象拷贝,深拷贝a.append(5) #修改对象a
a[4].append(c) #修改对象a中的[a, b]数组对象print a = , a
print b = , b
print c = , c
print d = , d输出结果...