米利唐_后腰_乌克兰足球超级联赛_中国竞彩欧赔 - 足球竞彩分析

集團官網
  • 國家級全民數字素養與技能培訓基地
  • 河南省第一批產教融合型企業建設培育單位
  • 鄭州市數字技能人才(碼農)培養評價聯盟

賦值、淺拷貝和深拷貝的區別在哪?

編輯:云和數據 日期:2023-02-17 17:40

賦值在 Python 中,對象的賦值就是簡單的對象引用,這點和 C++不同,如下所示:

a = [1,2,”hello”,[‘python’, ‘C++’]]
b = a
在上述情況下,a 和 b 是一樣的,他們指向同一片內存,b 不過是 a 的別名,是引用。 我們可以使用 b is a 去判斷,返回 True,表明他們地址相同,內容相同,也可以使用 id()函數來查看兩個列 表的地址是否相同。

賦值操作(包括對象作為參數、返回值)不會開辟新的內存空間,它只是復制了對象的引用。也就是 說除了 b 這個名字之外,沒有其他的內存開銷。修改了 a,也就影響了 b,同理,修改了 b,也就影響了 a。

淺拷貝會創建新對象,其內容非原對象本身的引用,而是原對象內第一層對象的引用。 淺拷貝有三種形式:切片操作、工廠函數、copy 模塊中的 copy 函數。 比如上述的列表 a;

切片操作:b = a[:] 或者 b = [x for x in a];工廠函數:b = list(a);
copy 函數:b = copy.copy(a);

淺拷貝

淺拷貝產生的列表 b 不再是列表 a 了,使用 is 判斷可以發現他們不是同一個對象,使用 id 查看,他們也 不指向同一片內存空間。但是當我們使用 id(x) for x in a 和 id(x) for x in b 來查看 a 和 b 中元素的地址時,可以 看到二者包含的元素的地址是相同的。

在這種情況下,列表 a 和 b 是不同的對象,修改列表 b 理論上不會影響到列表 a。

但是要注意的是,淺拷貝之所以稱之為淺拷貝,是它僅僅只拷貝了一層,在列表 a 中有一個嵌套的 list,如 果我們修改了它,情況就不一樣了。

比如:a[3].append(‘java’)。查看列表 b,會發現列表 b 也發生了變化,這是因為,我們修改了嵌套的 list,修 改外層元素,會修改它的引用,讓它們指向別的位置,修改嵌套列表中的元素,列表的地址并未發生變化,指向 的都是用一個位置。

深拷貝(deep copy)

深拷貝只有一種形式,copy 模塊中的 deepcopy()函數。深拷貝和淺拷貝對應,深拷貝拷貝了對象的所有元素,包括多層嵌套的元素。因此,它的時間和空間開銷要高。

同樣的對列表 a,如果使用 b = copy.deepcopy(a),再修改列表 b 將不會影響到列表 a,即使嵌套的列表具有更深的層次,也不會產生任何影響,因為深拷貝拷貝出來的對象根本就是一個全新的對象,不再與原來的對象有任何的關聯。

注意:對于非容器類型,如數字、字符,以及其他的“原子”類型,沒有拷貝一說,產生的都是原對象的引用。 如果元組變量值包含原子類型對象,即使采用了深拷貝,也只能得到淺拷貝。

相關內容

搶先一步 鴻蒙(HarmonyOS)應用開發者高級認證 免費考! 適合人群計算機相關專業在校生(技師、中職、高職、本科、研究生)對鴻蒙(HarmonyOS)有興趣的非計算機相關專業在校生目前正在從事移動應用的開發者目前正在從事計算機行業相關的人計算機專業高校老師所有對鴻蒙(HarmonyOS)有興趣的人 培訓方案掌握鴻蒙的核心概念和端云一體化開發、... 什么是Java的多態性(polymorphism)?它有哪些不同的形式? 多態性是Java面向對象編程的一個重要概念,它允許不同的對象以一致的方式響應同一個方法調用,具體表現為對象在運行時可以表現出多個不同的形態。多態性主要有兩種不同的形式:編譯時多態性(靜態多態性)和運行時多態性(動態多態性)。1. 編譯時多態性(靜態多態性):   ... 如何學習和搭建Hadoop開發環境? Hadoop是大數據處理領域的重要平臺,能夠處理和分析大量數據。為了有效地利用Hadoop,我們需要學習其基礎知識,并正確搭建開發環境。下面是詳細的學習和搭建指南。一、學習Hadoop基礎掌握基礎概念和原理Hadoop主要由HDFS和MapReduce兩部分組成。HDFS是分布式文件系統,Ma... UI 設計學習如何進階成為高手 我總結了六種方法,幫助你走出舒適區,提高技能,成長為自信且經驗豐富的UI設計高手一位經驗豐富的 UI 設計師,往往十分看中應用程序界面的吸引力和視覺刺激,確保滿足用戶期望和需求。但是,如果你已經在 UI 設計圈摸爬滾打多年,仍然沒有出色的作品,那你極有可能是因為陷入了一個舒適圈,UI技能一直原... 在Java中Executor和Executors的區別? 在Java中,Executor和Executors都與線程池和并發執行有關,但它們是不同的概念和類。1.ExecutorExecutor是一個接口,位于java.util.concurrent包中,用于表示一個執行任務的執行器。它只定義了一個方法:void execute(Runnable c... String類型的常見命令有哪些? String類型,也就是字符串類型,是Redis中最簡單的存儲類型。其value是字符串,不過根據字符串的格式不同,又可以分為3類:string是普通字符串,int整數類型,可以做自增、自減操作,float浮點類型,可以做自增、自減操作。String的常見命令有:SET:添加或者修改已經存在的...