网站建设原因,wordpress nginx php.ini,二级域名网站,有限公司在线网站本次文章要给大家讲解的是Python对象引用及复制代码#xff0c;相信这也是大家问题比较大的一个点#xff0c;下面为大家具体整理了操作过程#xff0c;一起来了解下。可以说Python没有赋值#xff0c;只有引用。你这样相当于创建了一个引用自身的结构#xff0c;所以导致…本次文章要给大家讲解的是Python对象引用及复制代码相信这也是大家问题比较大的一个点下面为大家具体整理了操作过程一起来了解下。可以说Python没有赋值只有引用。你这样相当于创建了一个引用自身的结构所以导致了无限循环。为了理解这个问题有个基本概念需要搞清楚。Python没有「变量」我们平时所说的变量其实只是「标签」是引用。python中ab表示的是对象a引用对象b对象a本身没有单独分配内存空间(重要不是复制)它指向计算机中存储对象b的内存。因此要想将一个对象复制为另一个对象不能简单地用等号操作要使用其它的方法。如序列类的对象是(列表、元组)要使用切片操作符(即:)来做复制。在python进行像b a这样的赋值时只会创建一个对a的新引用使a的引用计数加1而不会创建新的对象 a xyz import sys sys.getrefcount(a)3 b a sys.getrefcount(b)4 id(a)88292288L id(b)88292288L这样当引用的对象是可变对象的时候(列表字典可变集合等)会产生意料之外的行为 a [1, 2, 3, 4] b a b.append(5) a[1, 2, 3, 4, 5]因为a和b引用的是同一对象改变其中一个另外一个也会随之改变。当我们想建立一个副本而不是引用时可以复制对象。复制对象一般使用copy模块 a [1, 2, 3, 4] import copy b copy.copy(a) b.append(5) b[1, 2, 3, 4, 5] a[1, 2, 3, 4]这样就可以了但这种复制是一种浅复制复制的新对象中包含的是对原始对象中的项的引用如果对象的项为可变对象也会产生不可控行为 a [1, [1, 2]] b copy.copy(a) b[1].append(3) b[1, [1, 2, 3]] a[1, [1, 2, 3]]这时候就要使用深复制了。深复制将创建一个新对象并递归地复制它所包含的所有对象 a [1, [1, 2]] b copy.deepcopy(a) b[1].append(3) b[1, [1, 2, 3]] a[1, [1, 2]]对于不可改变的对象而言(字符串数字元组)等没有必要拷贝因为它们是不可改变的不用担心会不经意间改动了它们。拷贝操作也只会得到原对象 a (1, 2, 3) b copy.copy(a) a is bTrue对于可变对象来(列表字典可变集合)来说可以分别使用内置函数list(),dict(),set()来进行浅复制速度是比使用copy模块快的。列表也可以使用切片进行浅复制 a [1, 2, 3, 4] b a[:] a is bFalse b[1, 2, 3, 4]对序列数据类型(字符串列表元组)进行*操作时也仅仅是复制了对象中项的引用如果使用*创建一个多维列表 a [1, 2, 3] b [a] c b * 3 a.append(4) c[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]最好是在列表推导中使用浅复制来创建多维列表可以避免隐式的引用共享 a [1, 2, 3] c [list(a) for i in range(3)] a.append(4) c[[1, 2, 3], [1, 2, 3], [1, 2, 3]]