is 和 的區別 深 淺拷貝

2021-08-22 19:34:12 字數 2883 閱讀 9607

python中的物件包含三要素id、type、value。

1.id

在記憶體中儲存的位置,用來唯一標識乙個物件

-id(變數名)檢視id

2.type

標識物件的型別

type(變數名)檢視資料型別

3.value

is判斷的是a物件是否就是b物件,是通過type,value,id三者同時來判斷的。

==判斷的是a物件的值是否和b物件的值相等,是通過value,type來判斷的。

換句話說:

1)若a  is   b*****>true,則a==b一定相等,返回true;

2)若a==b ====> true, a is b 不一定;

1.定義:在python中物件的賦值其實就是物件的引用。當建立乙個物件,把它賦值給另乙個變數的時候,python並沒有拷貝這個物件,只是拷貝了這個物件的引用而已。

淺拷貝:拷貝了最外圍的物件本身,內部的元素都只是拷貝了乙個引用而已。也就是,把物件複製一遍,但是該物件中引用的其他物件不複製

深拷貝:外圍和內部元素都進行了拷貝物件本身,而不是引用。也就是,把物件複製一遍,並且該物件中引用的其他物件我也複製。

2.應用的範圍:

1,切片可以應用於:列表、元組、字串,但不能應用於字典。

2,深淺拷貝,既可應用序列(列表、元組、字串),也可應用字典。

3.深淺拷貝的作用:

1,減少記憶體的使用

2,以後在做資料的清洗、修改或者入庫的時候,對原資料進行複製乙份,以防資料修改之後,找不到原資料。

不可變物件型別,沒有被拷貝的說法,即便是用深拷貝,檢視id的話也是一樣的,如果對其重新賦值,也只是新建立乙個物件,替換掉舊的而已。一句話就是,不可變型別,不管是深拷貝還是淺拷貝,位址值和拷貝後的值都是一樣的。

1.淺拷貝:1)直接賦值(li1 = li):只傳遞物件的引用, li1指向物件li的記憶體位址空間,  因此, 原有列表li改變, 被賦值的li1也會做相應的改變

2)li2=li.copy()):li和li2的記憶體位址不同,因此原始資料改變 , 子物件不改變.

li2=li[:]

2.深拷貝:

import copy

li3=copy.deepcopy(li))

li和li3的記憶體位址不同,包含子物件的拷貝, 所以原始物件改變並不會造成深拷貝裡面任何子項的改變.

=淺拷貝:值相等,位址相等

copy淺拷貝:值相等,位址不相等

deepcopy深拷貝:值相等,變數位址不同,但子物件位址相等

***面試常問:請簡述賦值, 深拷貝和淺拷貝的區別?(python中如何拷貝乙個物件?)

- 直接賦值(li1 = li): 只傳遞物件的引用, li1指向物件li的記憶體位址空間,

因此, 原有列表li改變, 被賦值的li1也會做相應的改變.

- 深拷貝(import copy, eg: li3=copy.deepcopy(li)), li和li3的記憶體位址不同,

包含子物件的拷貝, 所以原始物件改變並不會造成深拷貝裡面任何子項的改變.

*** 當深拷貝和淺拷貝, 針對的物件全部是不可變資料型別時, 兩者效果相同;

*** 當深拷貝和淺拷貝, 針對的物件包含是可變資料型別時, 兩者才有上述區別;

Python is和 的區別,深淺拷貝的區別

id 表示在記憶體中儲存的位置 type表示變數的型別 value表示變數的值 is 是表示兩個變數是否指向的是同一塊記憶體空間,即id,type,value都相等 是表示兩個變數值是否相等 即type和value相等 即 如果 is 成立,則 一定成立,反之,不一定。li 1,2,3 li 1,2...

C 什麼是深淺拷貝,深淺拷貝的區別?

淺拷貝 class string string const string s str s.str string operator const string s 返回引用是為了連續的賦值 return this string 防止野指標的出現 str null char str get void st...

拷貝和深淺拷貝

當list2為list的拷貝物件時,list內的可變資料型別變化,list2變化 list內的不可變資料型別變化,list2變化。總之 list變化list2一定變化 list 1,2,3,4,list2 list print list print list2 1,2,3,4,5 1,2,3,4,5...