国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

淺析Python中的賦值和深淺拷貝

2020-02-16 02:04:29
字體:
來源:轉載
供稿:網友

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的子列表共享相同的內存空間。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 商河县| 平原县| 新竹县| 彰武县| 通海县| 师宗县| 罗山县| 扬州市| 武威市| 旺苍县| 舟山市| 财经| 信宜市| 道真| 潼关县| 黑河市| 油尖旺区| 安顺市| 新巴尔虎右旗| 祥云县| 抚州市| 开封县| 巴林左旗| 洛川县| 长顺县| 平罗县| 安国市| 余姚市| 晋中市| 太和县| 苏尼特右旗| 枣庄市| 依兰县| 朔州市| 绿春县| 普定县| 邛崃市| 五家渠市| 资源县| 兴业县| 郑州市|