Python对象的拷贝

Python对象的拷贝,第1张

Python赋值 *** 作或函数参数传递,传递的永远是对象引用(即内存地址),而不是对象内容。在Python中一切皆对象,对象又分为可变(mutable)和不可变(immutable)两种类型。对象拷贝是指在内存中创建新的对象,产生新的内存地址。当顶层对象和它的子元素对象全都是immutable不可变对象时,不存在被拷贝,因为没有产生新对象。浅拷贝(Shallow Copy),拷贝顶层对象,但不会拷贝内部的子元素对象。深拷贝(Deep Copy),递归拷贝顶层对象,以及它内部的子元素对象。

Python中一切皆对象,对象就像一个塑料盒子, 里面装的是数据。对象有不同类型,例如布尔型和整型,类型决定了可以对它进行的 *** 作。现实生活中的"陶器"会暗含一些信息(例如它可能很重且易碎,注意不要掉到地上)。

对象的类型还决定了它装着的数据是允许被修改的变量(可变的mutable)还是不可被修改的常量(不可变的immutable)。你可以把不可变对象想象成一个透明但封闭的盒子:你可以看到里面装的数据,但是无法改变它。类似地,可变对象就像一个开着口的盒子,你不仅可以看到里面的数据,还可以拿出来修改它,但你无法改变这个盒子本身,即你无法改变对象的类型。

对象拷贝是指在内存中创建新的对象,产生新的内存地址。

浅拷贝(Shallow Copy),拷贝顶层对象,但不会拷贝内部的子元素对象。

211 顶层是mutable,子元素全是immutable

当顶层对象是mutable可变对象,但是它的子元素对象全都是immutable不可变对象时,如[1, 'world', 2]

① 创建列表对象并赋值给变量a

② 导入copy模块,使用copycopy()函数浅拷贝a,并赋值给变量b

③ 修改变量a的子元素a[0] = 3,由于整数是不可变对象,所以并不是修改1变为3,而是更改a[0]指向对象3

当顶层对象是 mutable可变对象 ,但子元素也存在 mutable可变对象 时,如 [1, 2, ['hello','world']]

① 浅拷贝 copycopy() 只拷贝了顶层对象,没有拷贝子元素对象['hello','world'],即a[2]和b[2]指向同一个列表对象

② 修改a[2][1] = 'china',则b[2][1] = 'china'

当顶层对象是immutable不可变对象,同时它的子元素对象也全都是immutable不可变对象时,如(1, 2, 3)

变量a与变量b指向的是同一个元组对象,没有拷贝

当顶层对象是immutable不可变对象时,但子元素存在mutable可变对象时,如(1, 2, ['hello','world'])

变量a与变量b指向的是相同的元组对象,并且a[2]与b[2]指向同一个列表,所以修改a[2][1]会影响b[2][1]

深拷贝(Deep Copy),递归拷贝顶层对象,以及它内部的子元素对象

当顶层对象是mutable可变对象,但是它的子元素对象全都是immutable不可变对象时,如[1, 'world', 2]

变量a与变量b指向不同的列表对象,修改a[0]只是将列表a的第一个元素重新指向新对象,不会影响b[0]

当顶层对象是mutable可变对象,但子元素也存在mutable可变对象时,如[1, 2, ['hello','world']]

深拷贝既拷贝了顶层对象,又递归拷贝了子元素对象,所以a[2]与b[2]指向了两个不同的列表对象(但是列表对象的子元素初始指定的字符串对象一样),修改a[2][1] = 'china'后,它重新指向了新的字符串对象(内存地址为140531581905808),不会影响到b[2][1]

当顶层对象是immutable不可变对象,同时它的子元素对象也全都是immutable不可变对象时,如(1, 2, 3)

变量a与变量b指向的是同一个元组对象,不存在拷贝

当顶层对象是immutable不可变对象时,但子元素存在mutable可变对象时,如(1, 2, ['hello','world'])

变量a与变量b指向的是不同的元组对象,同时a[2]与b[2]指向不同的列表对象,所以修改a[2][1]不会影响b[2][1]

使用=是赋值,即将列表对象的引用也赋值给变量b,可以将列表对象想像成一个盒子,变量a相当于这个盒子上的标签,执行b = a后,相当于再在这个盒子上贴上b标签,a和b实际上指向的是同一个对象。因此,无论我们是通过a还是通过b来修改列表的内容,其结果都会作用于双方。

b/c/d都是a的复制,它们都指向了不同的列表对象,但是没有拷贝子元素,a[2]和b[2]/c[2]/d[2]指向同一个列表, 相当于浅拷贝的效果

使用分片[:] *** 作,a和b其实是指向同一个元组,而且没有拷贝子元素,a[2]和b[2]也指向同一个列表,相当于浅拷贝的效果

同列表类似,可以使用字典的copy()函数或者转换函数dict()

变量a与变量b/c指向不同的字典,但是没有拷贝子元素,a['jobs']和b['jobs']/c['jobs']指定同一个列表, 相当于浅拷贝的效果

同列表类似,可以使用集合的copy()函数或者转换函数set()

变量a与变量b/c指向不同的集合,而集合的元素必须是hashable,所以修改集合a不会影响到b/c

#include using namespace std; class student { public: void scoretotalcount( double s ) { score = s; total = total + score; count++; } static double sum() { return total; } static double average() { return total / count; } private: double score; static double total; static double count; }; double student::total=0; double student::count=0; int main() { int i,n; double s; cout > n; student stu; for( i=1; i

是STL里面的replace_copy()吗? 如果是,那么这个函数的意思就是把一个区间(range)的数据拷贝到另一个区间里;而且copy的同时,作replace(替换)。

比如:

#include <iostream>     

#include <algorithm>    

#include <vector>       

using namespace std;

int main () {

  int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };

  vector<int> myvector (8);

  

  replace_copy (myints, myints+8, myvectorbegin(), 20, 99);

  for (vector<int>::iterator it=myvectorbegin(); it!=myvectorend(); ++it)

    cout << ' ' << it;

  cout << '\n';

  

  return 0;

}

输出结果是:

10 99 30 30 99 10 10 99

就是把myints中的数据copy到myvector中,同时把myints中所有值=20的元素替换为99。

m :就是copy源,就是一个字符串,表示你将要从m里copy一些东西

11 : 从m中的第11位开始copy(包含第11位)

5 : copy从第11位开始后的5个字符

exp:

m:='the fellowship of the ring';

s:=copy(m, 2, 2);

//s就等于'he'

Python可以用来处理文件,包括读取、写入、复制和删除文件。它提供了一组简单而强大的函数,可以完成对文件的基本 *** 作。以下是其中几个常用的函数:

open()函数:用于打开文件,可以指定文件的模式(读、写或其他);

read()函数:用于读取文件中的内容;

write()函数:用于写入文件;

close()函数:用于关闭文件;

copy()函数:用于复制文件;

remove()函数:用于删除文件;

rename()函数:用于重命名文件。

Python还提供了一些模块,可以更方便地处理文件,如os、shutil和glob模块等。

shutilcopyfile( src, dst) 从源src复制到dst中去。当然前提是目标地址是具备可写权限。抛出的异常信息为IOException 如果当前的dst已存在的话就会被覆盖掉

shutilmove( src, dst) 移动文件或重命名

shutilcopymode( src, dst) 只是会复制其权限其他的东西是不会被复制的

shutilcopystat( src, dst) 复制权限、最后访问时间、最后修改时间

shutilcopy( src, dst) 复制一个文件到一个文件或一个目录

shutilcopy2( src, dst) 在copy上的基础上再复制文件最后访问时间与修改时间也复制过来了,类似于cp –p的东西

shutilcopy2( src, dst) 如果两个位置的文件系统是一样的话相当于是rename *** 作,只是改名;如果是不在相同的文件系统的话就是做move *** 作

shutilcopytree( olddir, newdir, True/Flase)

把olddir拷贝一份newdir,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接,如果第3个参数是False,则将在复制的目录下生成物理副本来替代符号连接

shutilrmtree( src ) 递归删除一个目录以及目录内的所有内容

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12170520.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存