当前位置:首页 » 编程语言 » python中的copy

python中的copy

发布时间: 2023-05-23 19:57:29

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


  • 结果如下:
  • [python]view plain

  • {'name':['An','Assan']}

  • {'name':['an']}

  • {'name':['An','Assan']}

  • (2)值修改

    [python]view plain

  • import

  • d={

  • 'name':['An','Assan']

  • }

  • c=d.()

  • dc=.deep(d)

  • d['name'].append('shu')

  • printc

  • printd

  • printdc


  • 结果如下:
  • [python]view plain

  • {'name':['An','Assan','shu']}

  • {'name':['An','Assan','shu']}

  • {'name':['An','Assan']}


  • 二、包中磨哪的函数,无论是修改还是值替换两者之间都互不影响。
  • [python]view plain

  • import

  • seq=[1,2,3]

  • seq1=seq

  • seq2=.(seq)

  • seq3=.deep(seq)

  • seq.append(4)

  • seq2[2]=5

  • printseq,seq1,seq2,seq3


  • 结果如下:
  • [python]view plain

  • [1,2,3,4][1,2,3,4][1,2,5][1,2,3]


  • 在上面代码中,sql1 = seq其实是同是指向同一个对象地址,使用的同一个对象引用。

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)

不知道你看懂了没有。

热点内容
U盘超级加密2008 发布:2025-05-19 19:44:32 浏览:452
灯带编程软件 发布:2025-05-19 19:32:30 浏览:285
如何判断服务器被多少人访问 发布:2025-05-19 19:27:45 浏览:123
编程stata 发布:2025-05-19 19:12:18 浏览:513
解压命令gz 发布:2025-05-19 19:11:37 浏览:823
linux下的程序开发 发布:2025-05-19 18:55:02 浏览:927
该文件夹未包含 发布:2025-05-19 18:54:17 浏览:195
安卓拳皇对战用哪个平台 发布:2025-05-19 18:42:39 浏览:531
华为畅玩5怎么取消锁屏密码 发布:2025-05-19 18:42:38 浏览:583
linuxrm文件夹 发布:2025-05-19 18:40:25 浏览:973