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)
不知道你看懂了沒有。