如何制作自己的網(wǎng)站免費福州seo網(wǎng)站管理
目錄
- 一、必備知識
- 二、基本概念
- 三、列表,元組,集合,字符串,字典淺拷貝
- 3.1 列表
- 3.2 元組
- 3.3 集合
- 3.4 字符串
- 3.5 字典
- 3.6 特別注意
- 淺拷貝總結
- 四、列表,元組,集合,字符串,字典深拷貝
一、必備知識
- 萬物皆對象:在學習python的深淺拷貝之前我們必須要知道一個事情,就是python對象的引用,在python里面,萬物皆對象,萬物皆對象,萬物皆對象,不管什么數(shù)據(jù)類型都是對象。我們定義一個變量并給這個變量賦值的時候賦的并不是這個對象值,而是這個對象引用,并不是一直值,如
a = 1
,這個時候并不是把1
這個值賦給了a
,而是把1
這個對象的引用賦值給了a
。 - 可變序列和不可變序列:可變序列就是可以直接對這個序列直接在原地址上進行數(shù)據(jù)修改,如果是不可變序列進行數(shù)據(jù)修改則會創(chuàng)建一個新的對象,讓我這個變量重新指向新的對象。關于這部分不不懂的小伙伴可以參考下這篇博文:Python的可變類型與不可變類型,如果看完還是有不明白的地方可以評論區(qū)留言。
二、基本概念
-
淺拷貝:淺拷貝會創(chuàng)建一個新的對象,但這個新對象的內容并不一定是原對象自身的復制(視具體數(shù)據(jù)而言)。具體來說,如果原對象的元素是可變的(比如列表或字典),淺拷貝會復制這些元素的引用,而不是元素本身。這意味著新對象和原對象會共享這些可變元素。如果對這些共享的元素進行修改,會影響到原對象。如果原對象的元素是不可變的(比如元組或字符串),淺拷貝則會復制這些元素的值,因為它們是不可變的,不會影響到原對象。淺拷貝通常有三種方式:自身構造器,切片和copy.copy()函數(shù),不同數(shù)據(jù)類型(列表,元組,字典,集合 ,字符串)的淺拷貝會有差異,下面會逐一介紹。
-
深拷貝:重新分配一塊新的內存,創(chuàng)建一個新的對象,并將原對象中的元素以遞歸的方式通過創(chuàng)建新的子對象拷貝到新的對象中。新的對象和原對象之間沒有任何關系。深拷貝使用copy.deepcopy()函數(shù)實現(xiàn)
-
python自帶數(shù)據(jù)類型: 列表,元組,字典,集合,字符串
三、列表,元組,集合,字符串,字典淺拷貝
3.1 列表
- 自身構造器:
>>> list1 = [1,2,3,4]
>>> list2 = list(list1)
>>> list2
[1, 2, 3, 4]
>>> id(list1)
140495553055488
>>> id(list2)
140495553080256
>>> list1==list2
True
- 切片
>>> list1 = [1,2,3,4]
>>> list2 = list1[:]
>>> list2
[1, 2, 3, 4]
>>> list1 is list2
False
>>> list1 == list2
True
- copy()函數(shù)
>>> import copy
>>> list1 = [1,2,3,4]
>>> list2 = copy.copy(list1)
>>> list1
[1, 2, 3, 4]
>>> list2
[1, 2, 3, 4]
>>> list1 is list2
False
>>> list1 == list2
True
注:python中的可變序列有自己的copy()方法,即對于列表和字典這種的對象可以使用list.copy()或者dict.copy()跟copy.copy()函數(shù)是等價的。
- 總結:python列表可以使用三種方式進行淺拷貝:自身構造器,切片,copy()函數(shù)。淺拷貝之后兩個變量的地址不一樣,但是數(shù)值是一樣的,
3.2 元組
- 自身構造器
>>> a = (1,2,3,4)
>>> b = tuple(a)
>>> a
(1, 2, 3, 4)
>>> b
(1, 2, 3, 4)
>>> a is b
True
>>> a == b
True
- 切片
>>> a = (1,2,3,4)
>>> b = a[:]
>>> a is b
True
>>> a == b
True
>>> a
(1, 2, 3, 4)
>>> b
(1, 2, 3, 4)
- copy函數(shù)
>>> import copy
>>> a = (1,2,3,4)
>>> b = copy.copy(a)
>>> a
(1, 2, 3, 4)
>>> b
(1, 2, 3, 4)
>>> a is b
True
>>> a == b
True
3.3 集合
- 自身構造器
>>> a = {1,2,3,4}
>>> b = set(a)
>>> a
{1, 2, 3, 4}
>>> b
{1, 2, 3, 4}
>>> a is b
False
>>> a == b
True
- copy函數(shù)()
>>> import copy
>>> a = {1,2,3,4}
>>> b = copy.copy(a)
>>> a
{1, 2, 3, 4}
>>> b
{1, 2, 3, 4}
>>> a is b
False
>>> a ==b
True
3.4 字符串
- 自身構造器
>>> a = "1234"
>>> b = str(a)
>>> a
'1234'
>>> b
'1234'
>>> a is b
True
>>> a == b
True
- 切片
>>> a = "1234"
>>> b = a[:]
>>> a
'1234'
>>> b
'1234'
>>> a is b
True
>>> a == b
True
- copy()
>>> import copy
>>> a = "1234"
>>> b = copy.copy(a)
>>> a
'1234'
>>> b
'1234'
>>> a is b
True
>>> a ==b
True
3.5 字典
- 自身構造器
>>> dict1 = {"a":1, 1:2}
>>> dict2 = dict(dict1)
>>> dict1
{'a': 1, 1: 2}
>>> dict2
{'a': 1, 1: 2}
>>> dict1 is dict2
False
>>> dict1 == dict2
True
- copy函數(shù)
>>> import copy
>>> dict1 = {"a":1, 1:2}
>>> dict2 = copy.copy(dict1)
>>> dict1
{'a': 1, 1: 2}
>>> dict2
{'a': 1, 1: 2}
>>> dict1 is dict2
False
>>> dict1 == dict2
True
3.6 特別注意
>>> list1 = [[1, 2], (30, 40)]
>>> list2 = list(list1)
>>> list1.append(100)
>>> list1
[[1, 2], (30, 40), 100]
>>> list2
[[1, 2], (30, 40)]
>>> list1[0].append(3)
>>> list1
[[1, 2, 3], (30, 40), 100]
>>> list2
[[1, 2, 3], (30, 40)]
>>> list1[1] += (50,60)
>>> list1
[[1, 2, 3], (30, 40, 50, 60), 100]
>>> list2
[[1, 2, 3], (30, 40)]
- 如果是可變類型,淺拷貝之后一個變量改變不會影響到另一個,但是如果是不可變類型,一個改變了會影響到另一個同時改變。
淺拷貝總結
- 可變數(shù)據(jù)類型的淺拷貝就是為新的變量重新分配一塊內存空間,和原來變量的內存不一樣,但是變量的值是一樣的
- 不可變數(shù)據(jù)類型不會發(fā)生淺拷貝,只是開辟了內存存儲原對象的引用,而不是存儲原對象的子對象的引用。
- 要與賦值操作區(qū)分,賦值只是把原對象的引用賦值給了新的變量,相當于這兩個變量指向同一個對象
四、列表,元組,集合,字符串,字典深拷貝
- python中的深拷貝就是直接使用copy.deepcopy()函數(shù),新的對象和原來的對象沒有任何關系。