python中的copy
A. python中和deep中的区别
这察橘其中的区别就槐模是浅复制会铅没缓简单的复制引用,不管他是mutable还是immutable。而深复制则会递归地复制immutable对象引用,对于mutable,则会新建一个对象。
import
a = [1, 2]
b = [a, 3]
c = .(b) #c = [[1, 2], 3]
d = .deep(b) #d = [[1, 2], 3]
a.append(3) #c = [[1, 2, 3], 3]
#d = [[1, 2], 3]
B. Python3 & 浅拷贝与深拷贝
在Python中对象的赋值(=)其实就是对象的引用。即:当创建一个对象,把它赋值给另一个变量时,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。
Python中对象的拷贝分为:浅拷贝()和深拷贝(deep)。
浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,将原对象在内存中引用地址拷贝过来,然后让新的对象指向这个地址。可以使用“=”或列表自带的()函数(如list.()),或使用模块的()函数。
深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用。即把对象复制一遍,并且该对象中引用的其他对象也同时复制,完全得到一个新的一模一样的对象,对新对象里的值进行修改不会影响原有对象,新对象和原对象完全分离开。深拷贝只能使用模块中deep()函数,使用前要导入:from import deep。
Python中对象分为不可变对象 、可变对象。
不可变对象:一旦创建就不可修改的对象,例如:字符串、元组、数字
可变对象:可以修改的对象,例如:列表、字典。
其中Python中的切片可以应用于:列表、元组、字符串,但不能应用于字典。
而深浅拷贝,可应用于序列(列表、元组、字符串),也可应用于字典。
其中不可变对象,不管是深拷贝还是浅拷贝,地址值在拷贝后的值都是一样的。
以下以元组(不可变类型)为例
从上述示例可以看出:
不可变对象类型,没有被拷贝的说法,即便是用深拷贝,查看id的话也是一样的,如果对其重新赋值,也只是新创建一个对象,替换掉旧的而已。
所以不可变类型,不管是深拷贝还是浅拷贝,地址值和拷贝后的值都是一样的。
以下以列表(可变类型)为例
第一种方法:使用=号浅拷贝
输出结果:
第二种方法:使用浅拷贝
输出结果:
第三种方法:使用deep深拷贝
输出结果:
从上述示例可以看出:
=浅拷贝:值相等,地址相等
浅拷贝:值相等,地址不相等
deep深拷贝:值相等,地址不相等
总结:
1,深浅拷贝都是对源对象的复制,占用不同的内存空间。
2,不可变类型的对象,对于深浅拷贝毫无影响,最终的地址值和值都是相等的。
3,可变类型的对象,使用=浅拷贝时, 值相等,地址相等,对新对象里的值进行修改同时会影响原有对象;使用浅拷贝时值相等,地址不相等;使用deep深拷贝时值相等,地址不相等。可以看出针对可变类型浅拷贝和deep深拷贝,对新对象里的值进行修改不会影响原有对象。
C. python使用方法一直报错,说在模块中没有这个方法,我引入了的呀!!
pycharm里, 如果你自己的代码文件名丛粗也是.py, 那这个import 就会引用你自己的代码, 而不是渗睁镇你想引用的那个模块, 而你自己的.py里肯定是没有早孝.()方法的, 所以报错.
把你的.py重命名, 应该就可以了
D. Python中和deep中的区别
最近在学习 Python编程,遇到和deep感到很困惑,现在针对这两个方法进行区分,一种是浅复制(),一种是深度复制(deep)。
首先说一下deep,所谓的深度复制,在这里我理解的是完全复制然后变成一个新的对象,复制的对象和被复制的对象没有任何关系,彼此之间无论怎么改变都相互不影响。
然后说一下,在这里我分为两类来说,一种是字首游纤典数据类型的函数,一种是包的函数。
一、字典数据类型的函数,当简单的值替换的时候,原始字典和复制过来的字典之间互不影响,但是当添加,删除等修改操作的时候,两者之间会相互影者仿响。
(1)值替换
[python]view plain
import
d={
'name':['An','Assan']
}
c=d.()
dc=.deep(d)
d['name']=['an']
printc
printd
printdc
- 结果如下:
{'name':['An','Assan']}
{'name':['an']}
{'name':['An','Assan']}
import
d={
'name':['An','Assan']
}
c=d.()
dc=.deep(d)
d['name'].append('shu')
printc
printd
printdc
- 结果如下:
{'name':['An','Assan','shu']}
{'name':['An','Assan','shu']}
{'name':['An','Assan']}
- 二、包中磨哪的函数,无论是修改还是值替换两者之间都互不影响。
import
seq=[1,2,3]
seq1=seq
seq2=.(seq)
seq3=.deep(seq)
seq.append(4)
seq2[2]=5
printseq,seq1,seq2,seq3
- 结果如下:
[1,2,3,4][1,2,3,4][1,2,5][1,2,3]
- 在上面代码中,sql1 = seq其实是同是指向同一个对象地址,使用的同一个对象引用。
[python]view plain
(2)值修改
[python]view plain
[python]view plain
[python]view plain
[python]view plain
E. Python札记44_模块(sys、)
模块的自信来自于,模块是拿来即用的,不用自己编写
模块在Python中就是一个.py的程序。同样是一个py的辩雀程序既可以当做程序来执行,也可以当做模块来引入。
比如现在有有个文件 mokuai.py 在 D:Pythondatalearningmokuai.py 中,模块中有个函数可以说是方法 lang
查看模块 mokuai 的具体特殊属性:
为了能够让Python器知道我们写的模块在什么位置,需要用sys.path.append("绝对路径")。在Python中将所有可饮用的模块加入到sys.path里面。
模块文件可以放置到任意指定的位置,只需要添加到环境变量即可。
定义两个变量和两个函数(方法),其中一个 带上 双下划线 的是私有变量 :
被视为私有的变量、函数或者类没有访问权限。携粗早改进方法:使用 __all__
解决办法 :在目录中放置一个 init .py文件。 init .py文件是一个空文件,这样目录中的其他py文件就可凳慧以当做模块引用。比如Peter目录下面有两个模块:.py1和.py2
pprint :让字典格式化输出
查看模块的信息,以pprint为例
模块中最重要的就是 和 deep 。
结果
F. Python复制文件命令合集
python的shutil模块提供了便捷的复制文件命令
shutil.(srcfile,dstfile) #拷贝文件,目标文件必须存在,否则就会报错
shutil.file(srcfile,dstfile) #拷贝文件,目标 文件无需巧芦凳存在
shutil.tree(srcdir,dstdir) #srcdir为源目录,dstdir为目标目录,复制时,如果dstdir已经存在时,会报FileExistsError错误,提示“当文件已存在时,无法创建该文件”
shutil.mode(src, dst) # 仅拷贝权限。内孝旅容、组、用户均不变,目标文件哗昌必须存在
G. Python的赋值与复制
对于Python的初学者,在对象的使用过程中,由于对变量的赋值和对象的复制中的概念模糊,导致程序出错。
例如,下面的代码:
输出结果为:
a = [6,2,3,4,5],
b = [6,2,3,4,5],
c = [1,2,3,4,5]
a等于b?True
a等于c?True
a是b?True
a是c? False
可以看到,a,b, c所指向的对象的值都相同(a==b为True). a和b都是代表同一个对象(a is b为True)。当我们通过变量b对该列表进行修改时,由于a也指向该列表,所以当打印a,b时,我们得到相同的值。 而a和c则是代表不同的对象(a is c为False),所以修改b所指向得列表不会改变c梭子乡的列表的值.
在Python中,所有的变量都代表了对象,即便是简单的数字类型(int, float, bool),也是以对象的形式存在的。我们看下面的代码:
输出结果是:
a==b为True
a is b为True
可见,a, b都是指向同一个对象。接下来,进行下面的操作,
输出结果是:
a = 1, b = 2
a is b为False
与前面的列表不同,当我们对b做修改时,实际上是给b赋予了一个新生成的对象,对数值类型来说,所有的数值运算都会创建一个数值对象,并将这个对象指定给变量。因此,a与b指向了不同的对象,数值也不同。
再回过头来看列表对象,
我们知道,b是与a指向同一对象的变量,使用b对该对象进行修改,与使用a对该对象进行修改,效果是完全一样的。如果我们需要需要一个与a完全相同又与a相互独立的列表,那么就需要复制这个对象,也就是新建一个内容和源对象相同的对象。
对于列表来说,最简单的复制方法是通过下标索引的方式创建新的列表:
对于各种数据类型通用的对象拷贝复制,我们可以使用python内建的模块。
对于复杂对象(如嵌套列表)的复制,则需要注意区分浅拷贝和深拷贝。我们来看下面的代码:
得到的结果是:
a[0] is b[0]为 True
a[0] is c[0]为 False
a = [[-1, 2, 3], [4, 5, 6]]
b = [[-1, 2, 3], [7, 8, 9]]
c = [[1, 2, 3], [4, 5, 6]]
a[1] is b[1]为False
从上面的代码我们可以看到,函数为浅拷贝,只拷贝了对象的外层,而对象内部所包含的对象仍然指向原有的对象。而deep则为深拷贝,对象内部的对象也进行了复制。
以上我们对变量的赋值和对象的复制做了更加深入的分析。在具体的使用中,我们需要根据具体来决定使用赋值、浅拷贝、深拷贝。
H. python 中如何实现对文件的复制、粘贴
file类中没有提供专门的文件复制函数,因此只能通过使用文件的读写函数来实现文件的复制。这里仅仅给出范例:
src = file("myfile.txt", "w+")
temp = ["hello world! \n"]
src.writelines(temp)
src.close()
src = file("myfile.txt", "r+")
des = file("myfile2.txt", "w+")
des.writelines(src.read())
src.close()
des.close()
shutil模块是另一个文件,目录的管理接口,提供了一些用于复制文件,目录的函数。file()函数可以实现文件的拷贝,声明如下:
file(src, des)
文件的剪切可以使用move()函数模拟,声明如下:
move(src,des)
功能:移动一个文件或者目录到指定的位置,并且可以根据参数des重命名移动后的文件。
I. python中怎样将文件拷贝到指定的目录下
代码:
import os
import shutil
from shutil import Error
from shutil import stat
from shutil import 2
src = "" #需要复制的文件目录
dst = "" #目标目录
def jiecptree(src, dst, symlinks=False, ignore=None): #声明函数 ree( 要复制的目录,目标目录,复制符号连接内容到新目录,没有要忽略文件)
names = os.listdir(src) #获得要复制目录的文件名列表,赋给变量 names
if ignore is not None: #如果 ignore 不是None值
ignored_names = ignore(src, names) # src目录中要忽略文件的名字赋给 ignored_names
else: # 否则
ignored_names = set() #ignore_name 被 不重复空元素集 赋值
if os.path.isdir(dst):
pass
else:
os.makedirs(dst)
# print"dstfirst:"+dst
errors = [] #声明 errors列
for name in names: #将names里的元素循环复制给name
if name in ignored_names: #如果name在要求被忽略的列里出现
continue #继续for循环(跳回for,从新循环下个元素)
srcname = os.path.join(src, name) #将路径名(src)添加到文名(name)之前然后赋值给 srcname
dstname = os.path.join(dst, name) #将路径名(dst)添加到文名(name)之前然后赋值给 dstcname
from shutil import Error
# print "name:"+name
# print "src:"+src
# print "dst:"+dst
try: #尝试
if os.path.islink(srcname):
continue
elif os.path.isdir(srcname): #如果srcname路径是存在
jiecptree(srcname, dstname, symlinks, ignore)
elif os.path.isdir(dstname):
os.remove(dstname)
2(srcname, dstname)
else: # 否则
2(srcname, dstname) # 复制srcname到dstname
# print "srcname:"+srcname
# print "dstname:"+dstname
# XXX What about devices, sockets etc.? #怎样装置
except (IOError, os.error), why: #除(IOError[与文件有关的异常],操作系统异常)外,返回原因
errors.append((srcname, dstname, str(why))) # 向errors列里添加,(要复制的目录,目标目录,错误原因)
# catch the Error from the recursive jiecptree so that we can 从递归复制中捕捉这个错误,以便于我们能继续复制其他文件
# continue with other files
except Error, err: #除错误外,返回错误:
errors.extend(err.args[0]) #扩展 errors 列,添加(err.args[0] 元素)
try: #尝试
stat(src, dst) # 从src复制权限位,上次访问时间,最后修改时间 到 dst,
except WindowsError: # 除 Windows错误 外:
# can't file access times on Windows 在Windows上无法复制文件访问时间
pass # 通过(不作任何处理)
except OSError, why: # 除 操作系统错误 外,返回原因:
errors.extend((src, dst, str(why))) #扩展 errors 列,添加(要复制的目录,目标目录,错误原因)
if errors: # 如果错误
raise Error(errors) # 提示错误
更多相关内容可参考资料http://www.viiboo.cn
J. python中函数怎么用
#!python3
#pw.py-.
PASSWORDS={'email':'',
'blog':'',
'luggage':'12345'}
importsys,pyperclip
iflen(sys.argv)<2:#检测执行时启昌备是否输入了参数
迅握print('Usage:pypw.py[account]-account悄毁password')
sys.exit()
account=sys.argv[1]#取出参数
ifaccountinPASSWORDS:
pyperclip.(PASSWORDS[account])#拷贝
print('Passwordfor'+account+'copiedtoclipboard.')
else:
print('Thereisnoaccountnamed'+account)
不知道你看懂了没有。