天天看點

【一個例子讓你明白python的指派和拷貝】

# 1.指派操作
def print_fuzhi():
    """
    指派操作中時間裡一份資料的引用,如果資料發生變化,所有的引用都發生變化
    """
    a = {
        "name": "alex",
        "age": 18,
        "gender": False,
        "hobby": [1, 2, 3],
        "other": {
            "address": "chaoyangqu",
        }
    }
    print("-" * 10 + "指派操作" + "-" * 10)
    b = a
    print(f"中繼資料的位址:{id(a), id(b)}")
    print(f"深層對象的位址:{id(a['hobby']), id(b['hobby'])}")
    b["name"] = "bob"
    b["hobby"][0] = 10
    b["hobby"].append(4)
    b["other"]["school"] = "北大"
    print(f"a:{a}")
    print(f"b:{b}")


# 2.淺copy
def print_copy():
    """
    淺拷貝拷貝位址
    淺拷貝對于隻拷貝對象資料的第一層,其他層仍然是引用
    """
    a = {
        "name": "alex",
        "age": 18,
        "gender": False,
        "hobby": [1, 2, 3],
        "other": {
            "address": "chaoyangqu",
        }
    }
    print("-" * 10 + "淺拷貝" + "-" * 10)
    from copy import copy
    b = copy(a)
    print(f"中繼資料的位址:{id(a), id(b)}")
    print(f"深層對象的位址:{id(a['hobby']), id(b['hobby'])}")
    b["name"] = "bob"
    b["hobby"][0] = 10
    b["hobby"].append(4)
    b["other"]["school"] = "北大"
    print(f"a:{a}")
    print(f"b:{b}")


# 3.深拷貝
def print_deepcopy():
    """
    深拷貝拷貝的是資料
    深拷貝對于隻拷貝對象資料的所有層,資料完全隔離
    """
    a = {
        "name": "alex",
        "age": 18,
        "gender": False,
        "hobby": [1, 2, 3],
        "other": {
            "address": "chaoyangqu",
        }
    }
    print("-" * 10 + "深拷貝" + "-" * 10)
    from copy import deepcopy
    b = deepcopy(a)
    print(f"中繼資料的位址:{id(a), id(b)}")
    print(f"深層對象的位址:{id(a['hobby']), id(b['hobby'])}")
    b["name"] = "bob"
    b["hobby"][0] = 10
    b["hobby"].append(4)
    b["other"]["school"] = "北大"
    print(f"a:{a}")
    print(f"b:{b}")


print_fuzhi()
print_copy()
print_deepcopy()
"""
>>>
----------指派操作----------
中繼資料的位址:(140624057016560, 140624057016560)
深層對象的位址:(140624056103392, 140624056103392)
a:{'name': 'bob', 'age': 18, 'gender': False, 'hobby': [10, 2, 3, 4], 'other': {'address': 'chaoyangqu', 'school': '北大'}}
b:{'name': 'bob', 'age': 18, 'gender': False, 'hobby': [10, 2, 3, 4], 'other': {'address': 'chaoyangqu', 'school': '北大'}}
----------淺拷貝----------
中繼資料的位址:(140624056999200, 140624056999840) # 原對象的位址不一樣說明是拷貝的資料
深層對象的位址:(140624056103392, 140624056103392) # 深層對象的位址一樣說明是拷貝的位址
a:{'name': 'alex', 'age': 18, 'gender': False, 'hobby': [10, 2, 3, 4], 'other': {'address': 'chaoyangqu', 'school': '北大'}}
b:{'name': 'bob', 'age': 18, 'gender': False, 'hobby': [10, 2, 3, 4], 'other': {'address': 'chaoyangqu', 'school': '北大'}}
----------深拷貝----------
中繼資料的位址:(140624057016560, 140624056999440)
深層對象的位址:(140624056103392, 140624057377088)
a:{'name': 'alex', 'age': 18, 'gender': False, 'hobby': [1, 2, 3], 'other': {'address': 'chaoyangqu'}}
b:{'name': 'bob', 'age': 18, 'gender': False, 'hobby': [10, 2, 3, 4], 'other': {'address': 'chaoyangqu', 'school': '北大'}}
"""