日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Python中赋值、浅拷贝、深拷贝

發布時間:2025/4/16 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中赋值、浅拷贝、深拷贝 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、賦值
Python中賦值就是對對象的簡單引用,這一點與C++不同,如下:

a = [1, '123', [12, 'C']] b = a 在上述情況下,a和b是一樣的,他們指向同一片內存,b不過是a的別名,是引用. 我們可以使用b is a 去判斷,返回True,說明他們地址相同,內容相同,也可以使用id()來看2個變量的地址是否相同。 賦值操作不會開辟新的內存,只是復制了對象的引用,也就是說除了b這個名字之外,沒有其他的 內存開銷。修改了a,也就影響了b,同理修改b也會影響a。

二、淺拷貝(shallow copy)

淺拷貝會創建新對象,其內容非原對象本身的引用,而是原對象內第一層對象的引用。 淺拷貝有三種形式:切片操作、工廠函數、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,即使嵌 套的列表具有更深的層次,也不會產生任何影響,因為深拷貝拷貝出來的對象根本就是一個全新的對 象,不再與原來的對象有任何的關聯。

四、拷貝的注意點?

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

總結

以上是生活随笔為你收集整理的Python中赋值、浅拷贝、深拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。