網站首頁 編程語言 正文
前言:
在Python中,對象賦值在本質上是對對象的引用,當創建一個對象把它賦值給另一個變量的時候,Python并沒有拷貝這個對象,而只是拷貝了這個對象的引用,這里通過程序,借用Python
中的copy模塊進一步理解深拷貝、淺拷貝和對象賦值有什么不同。
這里分兩種情況:
(1)、存在父對象和子對象
演示代碼如下:
import copy ? #調用copy模塊 Dict = {'animal':'cat','num':[10,20,30],'color':'pink'} #創建新字典 Dict1_copy = Dict.copy() ?#淺拷貝 Dict1_dcopy = copy.deepcopy(Dict) ?#深拷貝 Dict2 = Dict ? #直接賦值對象為淺拷貝 Dict['num'][1] = 66 ? #修改創建字典的內部值 print('Dict:'+str(Dict)) ?#輸出修改后的字典數據 print('Dict1_copy:'+str(Dict1_copy)) ?#輸出淺拷貝數據,數據被修改 print('Dict1_dcopy:'+str(Dict1_dcopy)) ?#輸出深拷貝的數據,數據未被修改 print('Dict2:'+str(Dict2)) ?#對象賦值,數據被修改
運行結果如下:
(2)、如果只存在父對象
演示代碼如下:
import copy ? #調用copy模塊 Dict = {'animal':'cat','num':'10','color':'pink'} #創建新字典 Dict1_copy = Dict.copy() ?#淺拷貝 Dict1_dcopy = copy.deepcopy(Dict) ?#深拷貝 Dict2 = Dict ? #淺拷貝,直接賦值對象 Dict['animal'] = 'dog' ? #修改創建字典的內部值 print('Dict:'+str(Dict)) ?#輸出修改后的字典數據 print('Dict1_copy:'+str(Dict1_copy)) ?#淺拷貝,但結果與深拷貝相同 print('Dict1_dcopy:'+str(Dict1_dcopy)) ?#輸出深拷貝的數據,數據未被修改 print('Dict2:'+str(Dict2)) ?#對象賦值,數據被修改
運行結果如下:
由此可以看出,數據修改后,深拷貝一定不會被修改;淺拷貝如果有所謂父對象和子對象即嵌套,第二層可以被修改,不同于深拷貝,如果不存在嵌套,只有父對象,雖然本質上與深拷貝不同,但不會被修改;對象賦值,則是引用,跟著修改而改變。
下面舉個簡單例子,改變特定的數值,對其它數值的影響:
Dict_A = { ? #建立新字典 ? ? "A":11, ? ? "B":22, ? ? "C":[33,44,55] } Dict_B = Dict_A ? ?#賦值操作 Dict_C = Dict_A.copy() ? #淺拷貝 Dict_D = copy.deepcopy(Dict_A) ? #深拷貝 print('Dict_A:'+str(Dict_A)) print('Dict_B:'+str(Dict_B)) print('Dict_C:'+str(Dict_C)) print('Dict_D:'+str(Dict_D))?
#修改Dict_D中A Dict_D['A'] = 99 print('Dict_A:'+str(Dict_A)) #變 print('Dict_B:'+str(Dict_B)) #變 print('Dict_C:'+str(Dict_C)) #不變 print('Dict_D:'+str(Dict_D)) #不變
#修改Dict_B中A Dict_B['A'] = 77 print('Dict_A:'+str(Dict_A)) #變 print('Dict_B:'+str(Dict_B)) #變 print('Dict_C:'+str(Dict_C)) #不變 print('Dict_D:'+str(Dict_D)) #不變
#修改Dict_C中A Dict_C['A'] = 88 print('Dict_A:'+str(Dict_A)) #不變 print('Dict_B:'+str(Dict_B)) #不變 print('Dict_C:'+str(Dict_C)) #變 print('Dict_D:'+str(Dict_D)) #不變
#修改Dict_D中A Dict_D['A'] = 99 print('Dict_A:'+str(Dict_A)) #不變 print('Dict_B:'+str(Dict_B)) #不變 print('Dict_C:'+str(Dict_C)) #不變 print('Dict_D:'+str(Dict_D)) #變
#修改Dict_A中C的第二項 Dict_C['C'][1] = 100 print('Dict_A:'+str(Dict_A)) #變 print('Dict_B:'+str(Dict_B)) #變 print('Dict_C:'+str(Dict_C)) #變 print('Dict_D:'+str(Dict_D)) #不變
#修改Dict_B中C的第二項 Dict_C['C'][1] = 101 print('Dict_A:'+str(Dict_A)) #變 print('Dict_B:'+str(Dict_B)) #變 print('Dict_C:'+str(Dict_C)) #變 print('Dict_D:'+str(Dict_D)) #不變
#修改Dict_C中C的第二項 Dict_C['C'][1] = 102 print('Dict_A:'+str(Dict_A)) #變 print('Dict_B:'+str(Dict_B)) #變 print('Dict_C:'+str(Dict_C)) #變 print('Dict_D:'+str(Dict_D)) #不變
#修改Dict_D中C的第二項 Dict_D['C'][1] = 104 print('Dict_A:'+str(Dict_A)) #不變 print('Dict_B:'+str(Dict_B)) #不變 print('Dict_C:'+str(Dict_C)) #不變 print('Dict_D:'+str(Dict_D)) #變
原文鏈接:https://blog.csdn.net/m0_46983541/article/details/124458604
相關推薦
- 2022-08-03 GoFrame?glist?基礎使用和自定義遍歷_Golang
- 2022-09-26 符合選擇器和css三大特性組合
- 2022-04-09 SpringBoot默認日志框架(slf4j)的使用以及配置文件
- 2022-08-03 C#?代碼大小寫規范說明_C#教程
- 2022-02-18 引入redis報錯Bean method ‘redisConnectionFactory‘ not
- 2022-04-01 K8s 創建Pod 的時候出現 Error: Error response from daemon:
- 2022-11-14 Spring中存取Bean對象的相關注解
- 2022-09-24 python實現字母閃爍效果的示例代碼_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支