⑴ python深拷貝和淺拷貝的區別
1、淺拷貝(shallow )
所謂「淺拷貝」,是指創建一個新的對象,其內容是原對象中元素的引用。(拷貝組合對象,不拷貝子對象)
常見的淺拷貝有:切片操作、工廠函數、對象的()方法、模塊中的函數。
2、深拷貝(deep )
所謂「深拷貝」,是指創建一個新的對象,然後遞歸的拷貝原對象所包含的子對象。深拷貝出來的對象與原對象沒有任何關聯。
深拷貝只有一種方式:模塊中的deep函數。
總結:
淺拷貝,沒有拷貝子對象,所以原始數據改變,子對象會改變
深拷貝,包含對象裡面的自對象的拷貝,所以原始對象的改變不會造成深拷貝里任何子元素的改變
⑵ python3下關於和deep中的區別
我們日常所說的復制(自己在電腦硬碟上的復制)就是深復制(deep),即將被復制對象完全再復制一遍作為獨立的新個體單獨存在。所以改變原有被復制對象不會對已經復制出來的新對象產生影響。
而淺復制()並不會產生一個獨立的對象單獨存在,他只是將原有的數據塊打上一個新標簽,所以當其中一個標簽指向的數據塊就會發生變化,另一個標簽也會隨之改變。這就和我們尋常意義上的復制有所不同了。
⑶ python中函數怎麼用
#!python3
#pw.py-.
PASSWORDS={'email':'',
'blog':'',
'luggage':'12345'}
importsys,pyperclip
iflen(sys.argv)<2:#檢測執行時是否輸入了參數
print('Usage:pypw.py[account]-accountpassword')
sys.exit()
account=sys.argv[1]#取出參數
ifaccountinPASSWORDS:
pyperclip.(PASSWORDS[account])#拷貝
print('Passwordfor'+account+'copiedtoclipboard.')
else:
print('Thereisnoaccountnamed'+account)
不知道你看懂了沒有。
⑷ 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]
⑸ python 為什麼有深拷貝淺拷貝
在寫Python過程中,經常會遇到對象的拷貝,如果不理解淺拷貝和深拷貝的概念,你的代碼就可能出現一些問題。所以,在這里按個人的理解談談它們之間的區別。
一、賦值(assignment)
在《Python FAQ1》一文中,對賦值已經講的很清楚了,關鍵要理解變數與對象的關系。
12345
>>> a = [1, 2, 3]>>> b = a>>> print(id(a), id(b), sep='\n')
在Python中,用一個變數給另一個變數賦值,其實就是給當前內存中的對象增加一個「標簽」而已。
如上例,通過使用內置函數 id() ,可以看出 a 和 b 指向內存中同一個對象。a is b會返回 True 。
二、淺拷貝(shallow )
注意:淺拷貝和深拷貝的不同僅僅是對組合對象來說,所謂的組合對象就是包含了其它對象的對象,如列表,類實例。而對於數字、字元串以及其它「原子」類型,沒有拷貝一說,產生的都是原對象的引用。
所謂「淺拷貝」,是指創建一個新的對象,其內容是原對象中元素的引用。(拷貝組合對象,不拷貝子對象)
常見的淺拷貝有:切片操作、工廠函數、對象的()方法、模塊中的函數。
12345678910
>>> a = [1, 2, 3]>>> b = list(a)>>> print(id(a), id(b)) # a和b身份不同140601785066200 140601784764968>>> for x, y in zip(a, b): # 但它們包含的子對象身份相同... print(id(x), id(y))... 140601911441984 140601911442048
從上面可以明顯的看出來,a 淺拷貝得到 b,a 和 b 指向內存中不同的 list 對象,但它們的元素卻指向相同的 int 對象。這就是淺拷貝!
三、深拷貝(deep )
所謂「深拷貝」,是指創建一個新的對象,然後遞歸的拷貝原對象所包含的子對象。深拷貝出來的對象與原對象沒有任何關聯。
深拷貝只有一種方式:模塊中的deep函數。
1234567891011
>>> import >>> a = [1, 2, 3]>>> b = .deep(a)>>> print(id(a), id(b))140601785065840 140601785066200>>> for x, y in zip(a, b):... print(id(x), id(y))... 140601911441984 140601911442048
看了上面的例子,有人可能會疑惑:
為什麼使用了深拷貝,a和b中元素的id還是一樣呢?
答:這是因為對於不可變對象,當需要一個新的對象時,python可能會返回已經存在的某個類型和值都一致的對象的引用。而且這種機制並不會影響 a 和 b 的相互獨立性,因為當兩個元素指向同一個不可變對象時,對其中一個賦值不會影響另外一個。
我們可以用一個包含可變對象的列表來確切地展示「淺拷貝」與「深拷貝」的區別:
>>> import >>> a = [[1, 2],[5, 6], [8, 9]]>>> b = .(a) # 淺拷貝得到b>>> c = .deep(a) # 深拷貝得到c>>> print(id(a), id(b)) # a 和 b 不同139832578518984 139832578335520>>> for x, y in zip(a, b): # a 和 b 的子對象相同... print(id(x), id(y))... 139832578622816 139832578623104>>> print(id(a), id(c)) # a 和 c 不同139832578518984 139832578622456>>> for x, y in zip(a, c): # a 和 c 的子對象也不同... print(id(x), id(y))... 139832578622816 139832578623392
從這個例子中可以清晰地看出淺拷貝與深拷貝地區別。
總結:
1、賦值:簡單地拷貝對象的引用,兩個對象的id相同。
2、淺拷貝:創建一個新的組合對象,這個新對象與原對象共享內存中的子對象。
3、深拷貝:創建一個新的組合對象,同時遞歸地拷貝所有子對象,新的組合對象與原對象沒有任何關聯。雖然實際上會共享不可變的子對象,但不影響它們的相互獨立性。
淺拷貝和深拷貝的不同僅僅是對組合對象來說,所謂的組合對象就是包含了其它對象的對象,如列表,類實例。而對於數字、字元串以及其它「原子」類型,沒有拷貝一說,產生的都是原對象的引用。
⑹ python列表怎麼復制
假設現有列表為a,
復制一個新列表為b。
用
b=a
這個語句,並不會復制出一個新的列表,只是復制了列表的地址。
無論是對a還是b進行修改,影響的都是同一個列表。
我們需要使用模塊中的deep函數:
import
a=[1, 2, 3]
b=.deep(a)這時的b才是一個列表,而不是列表的地址了。
⑺ 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重命名移動後的文件。
⑻ Python裡面如何拷貝一個對象(賦值,淺拷貝,深拷貝的區別)
賦值(=):就是創建了對象的一個新的引用,修改其中任意一個變數都會影響到另一個。
淺拷貝:創建一個新的對象,但它包含的是對原始對象中包含項的引用(如果用引用的方式修改其中一個對象,另外一個也會修改改變){1,完全切片方法;2,工廠函數,如list();3,模塊的()函數}
深拷貝:創建一個新的對象,並且遞歸的復制它所包含的對象(修改其中一個,另外一個不會改變){模塊的deep.deep()函數}