python复制函数 python复制命令

Python对象的拷贝 Python赋值操作或函数参数传递,传递的永远是对象引用(即内存地址),而不是对象内容 。在Python中一切皆对象 , 对象又分为可变(mutable)和不可变(immutable)两种类型 。对象拷贝是指在内存中创建新的对象,产生新的内存地址 。当顶层对象和它的子元素对象全都是immutable不可变对象时 , 不存在被拷贝,因为没有产生新对象 。浅拷贝(Shallow Copy),拷贝顶层对象,但不会拷贝内部的子元素对象 。深拷贝(Deep Copy) , 递归拷贝顶层对象,以及它内部的子元素对象 。
Python中一切皆对象,对象就像一个塑料盒子 , 里面装的是数据 。对象有不同类型,例如布尔型和整型 , 类型决定了可以对它进行的操作 。现实生活中的"陶器"会暗含一些信息(例如它可能很重且易碎,注意不要掉到地上) 。
对象的类型还决定了它装着的数据是允许被修改的变量(可变的mutable)还是不可被修改的常量(不可变的immutable) 。你可以把不可变对象想象成一个透明但封闭的盒子:你可以看到里面装的数据,但是无法改变它 。类似地,可变对象就像一个开着口的盒子,你不仅可以看到里面的数据 , 还可以拿出来修改它,但你无法改变这个盒子本身,即你无法改变对象的类型 。
对象拷贝是指在内存中创建新的对象,产生新的内存地址 。
浅拷贝(Shallow Copy),拷贝顶层对象 , 但不会拷贝内部的子元素对象 。
2.1.1. 顶层是mutable,子元素全是immutable
当顶层对象是mutable可变对象,但是它的子元素对象全都是immutable不可变对象时 , 如[1, 'world', 2]
① 创建列表对象并赋值给变量a
② 导入copy模块,使用copy.copy()函数浅拷贝a,并赋值给变量b
③ 修改变量a的子元素a[0] = 3,由于整数是不可变对象,所以并不是修改1变为3,而是更改a[0]指向对象3
当顶层对象是 mutable可变对象 ,但子元素也存在 mutable可变对象 时 , 如 [1, 2, ['hello','world']]
① 浅拷贝 copy.copy() 只拷贝了顶层对象,没有拷贝子元素对象['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
Python3 & 浅拷贝与深拷贝在Python中对象的赋值(=)其实就是对象的引用 。即:当创建一个对象 , 把它赋值给另一个变量时,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已 。
Python中对象的拷贝分为:浅拷贝(copy)和深拷贝(deepcopy) 。
浅拷贝:拷贝了最外围的对象本身 , 内部的元素都只是拷贝了一个引用而已 。也就是,将原对象在内存中引用地址拷贝过来,然后让新的对象指向这个地址 。可以使用“=”或列表自带的copy()函数(如list.copy()),或使用copy模块的copy()函数 。
深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用 。即把对象复制一遍,并且该对象中引用的其他对象也同时复制,完全得到一个新的一模一样的对象 , 对新对象里的值进行修改不会影响原有对象,新对象和原对象完全分离开 。深拷贝只能使用copy模块中deepcopy()函数,使用前要导入:from copy import deepcopy 。
Python中对象分为不可变对象 、可变对象 。
不可变对象:一旦创建就不可修改的对象 , 例如:字符串、元组、数字
可变对象:可以修改的对象,例如:列表、字典 。
其中Python中的切片可以应用于:列表、元组、字符串 , 但不能应用于字典 。
而深浅拷贝,可应用于序列(列表、元组、字符串) , 也可应用于字典 。
其中不可变对象,不管是深拷贝还是浅拷贝,地址值在拷贝后的值都是一样的 。
以下以元组(不可变类型)为例
从上述示例可以看出:
不可变对象类型 , 没有被拷贝的说法,即便是用深拷贝,查看id的话也是一样的,如果对其重新赋值 , 也只是新创建一个对象,替换掉旧的而已 。
所以不可变类型,不管是深拷贝还是浅拷贝,地址值和拷贝后的值都是一样的 。
以下以列表(可变类型)为例
第一种方法:使用=号浅拷贝
输出结果:
第二种方法:使用copy浅拷贝
输出结果:
第三种方法:使用deepcopy深拷贝
输出结果:
从上述示例可以看出:
=浅拷贝:值相等,地址相等
copy浅拷贝:值相等,地址不相等
deepcopy深拷贝:值相等 , 地址不相等
总结:
1,深浅拷贝都是对源对象的复制,占用不同的内存空间 。
2,不可变类型的对象,对于深浅拷贝毫无影响,最终的地址值和值都是相等的 。
3,可变类型的对象,使用=浅拷贝时,值相等,地址相等,对新对象里的值进行修改同时会影响原有对象;使用copy浅拷贝时值相等 , 地址不相等;使用deepcopy深拷贝时值相等,地址不相等 。可以看出针对可变类型copy浅拷贝和deepcopy深拷贝,对新对象里的值进行修改不会影响原有对象 。
如何使用python复制大概200G的数据[任何语言只要能实现]如果我理解的正确的话,楼主是要copy大文件吧 。
python最经常使用的copy函数 , 应该是shutil.copyfile()了 , 它默认以16384bytes 的大小作为缓冲区,对于小的文件,的确不错 。但是处理到大的文件的时候 , 性能下降就很严重 。过小的buffer会不合适 。
经过多次的尝试,发现10Mb的buffer最合适,再高也没有性能的提升 。重载后的copy函数如下
def copyFile(src, dst, buffer_size=10485760, perserveFileDate=True):
'''
Copies a file to a new location. Much faster performance than Apache Commons due to use of larger buffer
@param src:Source File
@param dst:Destination File (not file path)
@param buffer_size:Buffer size to use during copy
@param perserveFileDate:Preserve the original file date
'''
#Check to make sure destination directory exists. If it doesn't create the directory
dstParent, dstFileName = os.path.split(dst)
if(not(os.path.exists(dstParent))):
os.makedirs(dstParent)
#Optimize the buffer for small files
buffer_size = min(buffer_size,os.path.getsize(src))
if(buffer_size == 0):
buffer_size = 1024
if shutil._samefile(src, dst):
raise shutil.Error("`%s` and `%s` are the same file" % (src, dst))
for fn in [src, dst]:
try:
st = os.stat(fn)
except OSError:
# File most likely does not exist
pass
else:
# XXX What about other special files? (sockets, devices...)
if shutil.stat.S_ISFIFO(st.st_mode):
raise shutil.SpecialFileError("`%s` is a named pipe" % fn)
with open(src, 'rb') as fsrc:
with open(dst, 'wb') as fdst:
shutil.copyfileobj(fsrc, fdst, buffer_size)
if(perserveFileDate):
shutil.copystat(src, dst)
使用的时候记得添加相应的包 。
python 中如何实现对文件的复制、粘贴file类中没有提供专门的文件复制函数 , 因此只能通过使用文件的读写函数来实现文件的复制 。这里仅仅给出范例:
src = https://www.04ip.com/post/file("myfile.txt", "w ")
temp = ["hello world! \n"]
src.writelines(temp)
src.close()
src = https://www.04ip.com/post/file("myfile.txt", "r ")
des = file("myfile2.txt", "w ")
des.writelines(src.read()())
src.close()
des.close()
shutil模块是另一个文件 , 目录的管理接口 , 提供了一些用于复制文件,目录的函数 。copyfile()函数可以实现文件的拷贝,声明如下:
copyfile(src, des)
文件的剪切可以使用move()函数模拟,声明如下:
move(src,des)
功能:移动一个文件或者目录到指定的位置,并且可以根据参数des重命名移动后的文件 。
python字典操作函数字典是一种通过名字或者关键字引用的得数据结构,其键可以是数字、字符串、元组,这种结构类型也称之为映射 。字典类型是Python中唯一内建的映射类型,基本的操作包括如下:
(1)len():返回字典中键—值对的数量;
(2)d[k]:返回关键字对于的值;
(3)d[k]=v:将值关联到键值k上;
(4)del d[k]:删除键值为k的项;
(5)key in d:键值key是否在d中,是返回True , 否则返回False 。
(6)clear函数:清除字典中的所有项
(7)copy函数:返回一个具有相同键值的新字典;deepcopy()函数使用深复制,复制其包含所有的值 , 这个方法可以解决由于副本修改而使原始字典也变化的问题
(8)fromkeys函数:使用给定的键建立新的字典,键默认对应的值为None
(9)get函数:访问字典成员
(10)has_key函数:检查字典中是否含有给出的键
(11)items和iteritems函数:items将所有的字典项以列表方式返回,列表中项来自(键,值) , iteritems与items作用相似 , 但是返回的是一个迭代器对象而不是列表
(12)keys和iterkeys:keys将字典中的键以列表形式返回,iterkeys返回键的迭代器
(13)pop函数:删除字典中对应的键
(14)popitem函数:移出字典中的项
(15)setdefault函数:类似于get方法 , 获取与给定键相关联的值,也可以在字典中不包含给定键的情况下设定相应的键值
(16)update函数:用一个字典更新另外一个字典
(17) values和itervalues函数:values以列表的形式返回字典中的值,itervalues返回值得迭代器,由于在字典中值不是唯一的,所以列表中可以包含重复的元素
一、字典的创建
1.1 直接创建字典
d={'one':1,'two':2,'three':3}
printd
printd['two']
printd['three']
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
{'three':3,'two':2,'one':1}
1.2 通过dict创建字典
# _*_ coding:utf-8 _*_
items=[('one',1),('two',2),('three',3),('four',4)]
printu'items中的内容:'
printitems
printu'利用dict创建字典,输出字典内容:'
d=dict(items)
printd
printu'查询字典中的内容:'
printd['one']
printd['three']
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
items中的内容:
[('one',1), ('two',2), ('three',3), ('four',4)]
利用dict创建字典,输出字典内容:
{'four':4,'three':3,'two':2,'one':1}
查询字典中的内容:
或者通过关键字创建字典
# _*_ coding:utf-8 _*_
d=dict(one=1,two=2,three=3)
printu'输出字典内容:'
printd
printu'查询字典中的内容:'
printd['one']
printd['three']
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
输出字典内容:
{'three':3,'two':2,'one':1}
查询字典中的内容:
二、字典的格式化字符串
# _*_ coding:utf-8 _*_
d={'one':1,'two':2,'three':3,'four':4}
printd
print"three is %(three)s."%d
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
{'four':4,'three':3,'two':2,'one':1}
threeis3.
三、字典方法
3.1 clear函数:清除字典中的所有项
# _*_ coding:utf-8 _*_
d={'one':1,'two':2,'three':3,'four':4}
【python复制函数 python复制命令】 printd
d.clear()
printd
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
{'four':4,'three':3,'two':2,'one':1}
{}
请看下面两个例子
3.1.1
# _*_ coding:utf-8 _*_
d={}
dd=d
d['one']=1
d['two']=2
printdd
d={}
printd
printdd
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
{'two':2,'one':1}
{}
{'two':2,'one':1}
3.1.2
# _*_ coding:utf-8 _*_
d={}
dd=d
d['one']=1
d['two']=2
printdd
d.clear()
printd
printdd
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
{'two':2,'one':1}
{}
{}
3.1.2与3.1.1唯一不同的是在对字典d的清空处理上,3.1.1将d关联到一个新的空字典上,这种方式对字典dd是没有影响的 , 所以在字典d被置空后,字典dd里面的值仍旧没有变化 。但是在3.1.2中clear方法清空字典d中的内容,clear是一个原地操作的方法 , 使得d中的内容全部被置空,这样dd所指向的空间也被置空 。
3.2 copy函数:返回一个具有相同键值的新字典
# _*_ coding:utf-8 _*_
x={'one':1,'two':2,'three':3,'test':['a','b','c']}
printu'初始X字典:'
printx
printu'X复制到Y:'
y=x.copy()
printu'Y字典:'
printy
y['three']=33
printu'修改Y中的值,观察输出:'
printy
printx
printu'删除Y中的值,观察输出'
y['test'].remove('c')
printy
printx
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
初始X字典:
{'test': ['a','b','c'],'three':3,'two':2,'one':1}
X复制到Y:
Y字典:
{'test': ['a','b','c'],'one':1,'three':3,'two':2}
修改Y中的值,观察输出:
{'test': ['a','b','c'],'one':1,'three':33,'two':2}
{'test': ['a','b','c'],'three':3,'two':2,'one':1}
删除Y中的值 , 观察输出
{'test': ['a','b'],'one':1,'three':33,'two':2}
{'test': ['a','b'],'three':3,'two':2,'one':1}
注:在复制的副本中对值进行替换后,对原来的字典不产生影响,但是如果修改了副本,原始的字典也会被修改 。deepcopy函数使用深复制,复制其包含所有的值,这个方法可以解决由于副本修改而使原始字典也变化的问题 。
# _*_ coding:utf-8 _*_
fromcopyimportdeepcopy
x={}
x['test']=['a','b','c','d']
y=x.copy()
z=deepcopy(x)
printu'输出:'
printy
printz
printu'修改后输出:'
x['test'].append('e')
printy
printz
运算输出:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
输出:
{'test': ['a','b','c','d']}
{'test': ['a','b','c','d']}
修改后输出:
{'test': ['a','b','c','d','e']}
{'test': ['a','b','c','d']}
3.3 fromkeys函数:使用给定的键建立新的字典,键默认对应的值为None
# _*_ coding:utf-8 _*_
d=dict.fromkeys(['one','two','three'])
printd
运算输出:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
{'three':None,'two':None,'one':None}
或者指定默认的对应值
# _*_ coding:utf-8 _*_
d=dict.fromkeys(['one','two','three'],'unknow')
printd
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
{'three':'unknow','two':'unknow','one':'unknow'}
3.4 get函数:访问字典成员
# _*_ coding:utf-8 _*_
d={'one':1,'two':2,'three':3}
printd
printd.get('one')
printd.get('four')
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
{'three':3,'two':2,'one':1}
1
None
注:get函数可以访问字典中不存在的键,当该键不存在是返回None
3.5 has_key函数:检查字典中是否含有给出的键
# _*_ coding:utf-8 _*_
d={'one':1,'two':2,'three':3}
printd
printd.has_key('one')
printd.has_key('four')
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
{'three':3,'two':2,'one':1}
True
False
3.6 items和iteritems函数:items将所有的字典项以列表方式返回 , 列表中项来自(键 , 值),iteritems与items作用相似,但是返回的是一个迭代器对象而不是列表
# _*_ coding:utf-8 _*_
d={'one':1,'two':2,'three':3}
printd
list=d.items()
forkey,valueinlist:
printkey,':',value
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
{'three':3,'two':2,'one':1}
three :3
two :2
one :1
# _*_ coding:utf-8 _*_
d={'one':1,'two':2,'three':3}
printd
it=d.iteritems()
fork,vinit:
print"d[%s]="%k,v
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
{'three':3,'two':2,'one':1}
d[three]=3
d[two]=2
d[one]=1
3.7 keys和iterkeys:keys将字典中的键以列表形式返回,iterkeys返回键的迭代器
# _*_ coding:utf-8 _*_
d={'one':1,'two':2,'three':3}
printd
printu'keys方法:'
list=d.keys()
printlist
printu'\niterkeys方法:'
it=d.iterkeys()
forxinit:
printx
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
{'three':3,'two':2,'one':1}
keys方法:
['three','two','one']
iterkeys方法:
three
two
one
3.8 pop函数:删除字典中对应的键
# _*_ coding:utf-8 _*_
d={'one':1,'two':2,'three':3}
printd
d.pop('one')
printd
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
{'three':3,'two':2,'one':1}
{'three':3,'two':2}
3.9 popitem函数:移出字典中的项
# _*_ coding:utf-8 _*_
d={'one':1,'two':2,'three':3}
printd
d.popitem()
printd
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
{'three':3,'two':2,'one':1}
{'two':2,'one':1}
3.10 setdefault函数:类似于get方法,获取与给定键相关联的值,也可以在字典中不包含给定键的情况下设定相应的键值
# _*_ coding:utf-8 _*_
d={'one':1,'two':2,'three':3}
printd
printd.setdefault('one',1)
printd.setdefault('four',4)
printd
运算结果:
{'three':3,'two':2,'one':1}
{'four':4,'three':3,'two':2,'one':1}
3.11 update函数:用一个字典更新另外一个字典
# _*_ coding:utf-8 _*_
d={
'one':123,
'two':2,
'three':3
}
printd
x={'one':1}
d.update(x)
printd
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
{'three':3,'two':2,'one':123}
{'three':3,'two':2,'one':1}
3.12 values和itervalues函数:values以列表的形式返回字典中的值,itervalues返回值得迭代器 , 由于在字典中值不是唯一的,所以列表中可以包含重复的元素
# _*_ coding:utf-8 _*_
d={
'one':123,
'two':2,
'three':3,
'test':2
}
printd.values()
运算结果:
=======RESTART: C:\Users\Mr_Deng\Desktop\test.py=======
[2,3,2,123]
python列表怎么复制提问者这么短的描述,有点无法看懂,那就按照通常的几种方法来说吧:
简单列表的拷贝
已知一个列表,求生成一个新的列表,列表元素是原列表的复制
a=[1,2]
b=a
这种其实并未真正生成一个新的列表,b指向的仍然是a所指向的对象 。
后果:如果对a或b的元素进行修改,a,b的值同时发生变化 。
可以使用以下方法解决:
a=[1,2]
b=a[:]
这样修改a对b没有影响 。修改b对a没有影响 。
复杂列表的拷贝:
可以使用copy模块中的deepcopy函数 。修改测试如下:
import copy
a=[1,[2]]
b=copy.deepcopy(a)
python复制函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于python复制命令、python复制函数的信息别忘了在本站进行查找喔 。

    推荐阅读