Flaches Kopieren und tiefes Kopieren von Python3 (copy und copy.deepcopy)

Die Funktion copy() wird zum Kopieren von Listen verwendet, ähnlich wie a[:] (Slices sind ebenfalls flache Kopien).

Grammatik:

          list.copy()

Geben Sie die neue Liste nach dem Kopieren zurück.

1. Aufgabenvergleich

        Die Liste

l1 = [1, 2, 3]
l2 = l1
l1.append('a')
print(l1, l2)               # [1, 2, 3, 'a'], [1, 2, 3, 'a']
print(id(l1), id(l2))          # 43499848 43499848
#可以看到两个列表的值以及id值相同,对应的是同一个内存地址

        Wörterbuch

dic = {'name': 'barry'}
dic1 = dic
dic['age'] = 18
print(dic, dic1)            # {'name': 'barry', 'age': 18}, {'name': 'barry', 'age': 18}
print(id(dic), id(dic1))       # 31157344 31157344
#可以看到两个字典的值以及id值相同,对应的是同一个内存地址

        Zeichenfolge

s = 'alex'
s1 = s
s2 = s.replace('a', 'A')
print(s, s1, s2)                  # alex alex Alex
print(id(s), id(s1), id(s2))           # 31040208 31040208 31040376
#赋值是同一个内存地址,替换字符串后的变量s2是另外的地址

Zwei, flache Kopie

1. Flache Kopie

        Bei einer flachen Kopie erstellt die erste Ebene neue Speicheradressen. Ab der zweiten Schicht zeigt es auf dieselbe Speicheradresse, sodass die Konsistenz für die zweite Schicht und tiefere Schichten gewahrt bleibt.

        Normale flache Kopie

l1 = [1, 2, 3, 4]
l2 = l1.copy()
l1.append('a')
print(l1, l2)                     # [1, 2, 3, 4, 'a'], [1, 2, 3, 4]
print(id(l1), id(l2))             # 37077320 37078664
#id内存地址不一样,创建了两个地址空间,一个改变,另一个不会变化

        verschachtelte flache Kopie

l1 = [1, [22, 33, 44], 3, 4]
l2 = l1.copy()
l1[0] = 111
print(l1, l2)                     # [111, [22, 33, 44], 3, 4], [1, [22, 33, 44], 3, 4]
print(id(l1), id(l2))             # 43370120 43369864
# 第一层都是独立的,改一个不影响另一个的结果

l1 = [1, [22, 33, 44], 3, 4]
l2 = l1.copy()
l1[1].append('a')
print(l1, l2)                # [1, [22, 33, 44, 'a'], 3, 4], [1, [22, 33, 44, 'a'], 3, 4]
print(id(l1), id(l2))             # 43173512 43173256
print(id(l1[1]), id(l2[1]))       # 43172168 43172168
# 第一层都是独立的的。从第二层开始都是是公用的,改一个都会变。

2. copy.deepcopy()

        Bei Deep Copy sind die beiden völlig unabhängig und ändern die Elemente einer Ebene (egal wie viele Ebenen), die andere wird sich nie ändern.

import copy

l1 = [1, [22, 33, 44], 3, 4]
l2 = copy.deepcopy(l1)
# 改变第一层
l1[0] = 111
print(l1, l2)                   # [111, [22, 33, 44], 3, 4], [1, [22, 33, 44], 3, 4]
print(id(l1), id(l2))           # 43238536 43239048

# 改变第二层
l1[1].append('a')
print(l1, l2)                   # [111, [22, 33, 44, 'a'], 3, 4], [1, [22, 33, 44], 3, 4]
print(id(l1), id(l2))           # 214166280 230926600
print(id(l1[1]), id(l2[1]))       # 2408680427840 2408878212480

PS: Die Kopie des Wörterbuchs ist eine tiefe Kopie

l1 = {"key": "hello", "num": 18}
l2 = l1.copy()
l1["key"] = "one"
l2["key"] = "two"
print(l1, l2)              # {'key': 'one', 'num': 18}, {'key': 'two', 'num': 18}
print(id(l1), id(l2))      # 4382946792 4382946864

 Zusammenfassen:

           Flache Kopie, das heißt, nur die erste Ebene ist unabhängig.
           Bei Deep Copy sind alle Ebenen unabhängig voneinander.

Guess you like

Origin blog.csdn.net/weixin_41611054/article/details/96142700