郑州建网站价格,大力推广建设电子商务网站技术,沧州百胜,网站建设与实现 文献综述在Python中#xff0c;对象赋值实际上是对象的引用。当创建一个对象#xff0c;然后把它赋给另一个变量的时候#xff0c;Python并没有拷贝这个对象#xff0c;而只是拷贝了这个对象的引用。1、浅拷贝#xff1a;利用切片操作、工厂方法list方法拷贝2、深拷贝#xff1a;…在Python中对象赋值实际上是对象的引用。当创建一个对象然后把它赋给另一个变量的时候Python并没有拷贝这个对象而只是拷贝了这个对象的引用。1、浅拷贝利用切片操作、工厂方法list方法拷贝2、深拷贝利用copy中的deepcopy方法进行拷贝一、浅拷贝如下浅拷贝操作In [113]: a[chongyi,[zhang,22]]In [114]: ba[:]b通过切片操作拷贝aIn [115]: clist(a)c通过工厂方法拷贝aIn [116]: printid(a),id(b),id(c)50383040 49098264 50381384由上从a、b、c的id值来看三者是不同的对象1、操作1更改a、b、c第一个元素In [126]: a[0]jiangxiIn [127]: b[0]shandongIn [128]: c[0]shanghaiIn [132]: printa,b,c[jiangxi, [zhang, 22]] [shandong, [zhang, 22]] [shanghai, [zhang, 22]]结果各自更改成功没有异常。2、操作2更改b第二个元素里面的第二个元素In [137]: b[1][1]18In [138]: printa,b,c[jiangxi, [zhang, 18]] [shandong, [zhang, 18]] [shanghai, [zhang, 18]]结果只是想改b部分却都发生了改变3、操作1、操作2解析针对第一个元素a、b、c索引不同更改一个后其他的不会变但是对于第二个元素列表[zhang, 22]a、b、c通过不同的索引指向了同一个索引所以b改完后其他a、c也都会变。二、深拷贝使用copy中的deepcopy方法进行拷贝。In [3]: a[jiangxi,[chongyi,123]]In [4]: importcopyIn [5]: bcopy.deepcopy(a)In [6]: ccopy.deepcopy(a)In [7]: b[0]shandongIn [8]: c[0]shanghaiIn [9]: printa,b,c[jiangxi, [chongyi, 123]] [shandong, [chongyi, 123]] [shanghai, [chongyi, 123]]In [10]: b[1][0]jinanIn [11]: printa,b,c[jiangxi, [chongyi, 123]] [shandong, [jinan, 123]] [shanghai, [chongyi, 123]]由此可见通过deepcopy的对象引用互相不影响。In [12]: [id(x) for x ina]Out[12]: [46257376, 46218488]In [13]: [id(x) for x inb]Out[13]: [46257184, 46106600]In [14]: [id(x) for x inc]Out[14]: [46257472, 46248520]深拷贝就是在复制某些容器对象(list)的时候重新在内存里分配一个空间存放复制过来的索引(引用---二层索引)不是重新复制一份底层的对象的内容在内存里。说白了深拷贝复制引用且单独为其开辟一个内存空间存放。PS1、容器可以存放其他类型的内容2、列表(list)可以存放字符串、数值、列表三、深、浅拷贝总结思路一利用切片操作和工厂方法list方法拷贝是浅拷贝只是拷贝了最外围的对象本身内部的元素都只是拷贝了一个引用而已。思路二利用copy中的deepcopy方法进行拷贝是深拷贝外围和内部元素都进行了拷贝对象本身而不是引用。对于数字字符串和其他原子类型对象等没有被拷贝的说法(没有层次)即便是用深拷贝查看id的话也是一样的如果对其重新赋值也只是新创建一个对象替换掉旧的而已。