python中,A object = B object 是一種賦值操作,賦的值不是一個對象在內存中的空間,而只是這個對象在內存中的位置 。

此時當B對象里面的內容發生更改的時候,A對象也自然而然的會跟著更改。
name = ["root","admin"]cp_name = name # 對cp_name進行賦值操作# 對name列表進行插入name.append('root_temp')print(name,cp_name) # ['root', 'admin', 'root_temp'] ['root', 'admin', 'root_temp']print(id(name),id(cp_name)) # 23991960 23991960而想要進行淺拷貝或者深拷貝,就需要引入copy模塊 。
首先來說下淺拷貝,當進行淺拷貝時,使用copy.copy()方法。
import copyname = ["root","admin"]# 進行淺拷貝操作cp_name = copy.copy(name)# 查看cp_name,nameprint(name,cp_name) # ['root', 'admin'] ['root', 'admin'] 拷貝成功#查看地址print(id(name),id(cp_name)) # 21146920 21147160 內存地址并不相同# 嘗試對name進行更改name.append('root_temp')# 查看cp_name是否更改print(cp_name) # ['root', 'admin'] 內容并沒有更改A = copy.copy(B) 此時A對象相當于把B對象中的內容給完成的拷貝了一份,存儲在了一份新的內存地址當中。
其中有一點需要注意,如下:
import copyname = ['root','admin',['root_temp','admin_temp']]cp_name = copy.copy(name)# 查看兩個對象的地址print(id(name),id(cp_name)) # 24358504 24428952 二者的地址并不相同# 對name 進行更改name.append('test')# 查看cp_name是否更改print(cp_name) # ['root', 'admin', ['root_temp', 'admin_temp']] cp_name并未更改# 在來對name中的列表對象進行更改name[2].append('ttttt')print(cp_name) # ['root', 'admin', ['root_temp', 'admin_temp', 'ttttt']] 發現cp_name內容發生了變化在上面的代碼中,通過copy.copy()方法把name對象淺拷貝給了cp_name,此時二者的內容相同,但是地址不同,說明通過淺拷貝后,cp_name相當于重新開辟了一塊內存空間用來存儲拷貝過來的內容。所以說,當name.append()第一次插入值的時候,cp_name對象沒有變化,因為cp_name和name 處于兩個不同的內存空間,是獨立的。
而淺拷貝的問題在于,只能夠拷貝第一層的內容,至于說第二層以及第三層或者第n層,對于淺拷貝來說都是無能為力的,只能簡單的拷貝一份內存地址。
所以說,對于name 這個對象中,列表第一層發生更改,是不會影響cp_name的,而一旦更改了第二層或者第n層的內容,cp_name都會被影響,因為此時的cp_name對象里面子列表是與name的子列表共享相同的內存空間。
新聞熱點
疑難解答