zoukankan      html  css  js  c++  java
  • Python学习-列表深浅拷贝

    一、先看一个简单的赋值语句

    lst1 = ['France', 'Belgium', 'England']
    lst2 = lst1
    # lst1.append('Uruguay')
    lst2.append('Uruguay')
    print(lst1, lst2)
    # 猜测一下lst1, lst2的结果;lst2变化是否对lst1产生影响,lst1变化是否对lst2产生影响

    输出结果:

    ['France', 'Belgium', 'England', 'Uruguay'] ['France', 'Belgium', 'England', 'Uruguay']

    不知道你是否猜对了?是否对输出结果感到疑惑?我们来看一下,在内存中变量与对象的对应关系,以及具体变化。

    (图画的不是很好, Pages工具用的不是很熟, 请见谅)

    由上图可知,改变lst1或lst2,lst1和lst2同时发生变化。

    二、列表的浅拷贝

    浅拷贝(copy): 拷贝父对象, 不会拷贝对象的内部的子对象.

    1、代码示例1

    # 浅拷贝
    movies = ['药神', '邪不压正', ['美国往事', '辛德勒的名单'], '无问西东']
    movies_c = movies.copy()
    
    movies.append('解救吾先生')  # 直接改变movies列表
    print('movies:', movies)
    print('movies_c', movies_c)
    
    # 运行结果
    movies: ['药神', '邪不压正', ['美国往事', '辛德勒的名单'], '无问西东', '解救吾先生']
    movies_c ['药神', '邪不压正', ['美国往事', '辛德勒的名单'], '无问西东']

    2、代码示例2

    # 浅拷贝
    movies = ['药神', '邪不压正', ['美国往事', '辛德勒的名单'], '无问西东']
    movies_c = movies.copy()
    
    movies[2].append('教父')  # 改变列表内部嵌套的列表
    print('movies:', movies)
    print('movies_c', movies_c)
    
    # 运行结果
    movies: ['药神', '邪不压正', ['美国往事', '辛德勒的名单', '教父'], '无问西东']
    movies_c ['药神', '邪不压正', ['美国往事', '辛德勒的名单', '教父'], '无问西东']

    结论:

      1) 由代码示例1和示例2的结果可以看出, 直接改变列表(一级元素增删改), 拷贝的列表不受影响;

      2) 当改变列表内部嵌套的列表的元素时, 拷贝的列表也受影响.

    三、列表的深拷贝

    深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

    1、代码示例3

    # 深拷贝
    import copy
    movies = ['药神', '邪不压正', ['美国往事', '辛德勒的名单'], '无问西东']
    movies_c = copy.deepcopy(movies)
    
    movies.append('万箭穿心')
    print('movies:', movies)
    print('movies_c:', movies_c)
    
    运行结果:
    movies: ['药神', '邪不压正', ['美国往事', '辛德勒的名单'], '无问西东', '万箭穿心']
    movies_c: ['药神', '邪不压正', ['美国往事', '辛德勒的名单'], '无问西东']

    2、代码示例4

    # 深拷贝
    import copy
    movies = ['药神', '邪不压正', ['美国往事', '辛德勒的名单'], '无问西东']
    movies_c = copy.deepcopy(movies)
    
    movies[2].append('这个杀手不太冷')
    print('movies:', movies)
    print('movies_c:', movies_c)
    
    运行结果:
    movies: ['药神', '邪不压正', ['美国往事', '辛德勒的名单', '这个杀手不太冷'], '无问西东']
    movies_c: ['药神', '邪不压正', ['美国往事', '辛德勒的名单'], '无问西东']

    结论: 不管是直接改变列表(一级元素增删改), 还是改变列表内部嵌套的列表, 拷贝的列表不受影响.

    深浅拷贝, 参考了菜鸟教程, 点击跳转. 拷贝前后, 变量与对象在内存中的对应关系, 可以参考教程中的图文解释.

  • 相关阅读:
    修改版的jsonView,加入了PHP的反序列化
    CSBlogV2公测发布,欢迎大家下载试用体验.
    C#里使用Oracle提供的Oracle.DataAccess 返回包里的记录集游标,含Oralce里的分页包代码
    用一个示例方法来初始理解ManualResetEvent的用法。
    Head First 设计模式阅读所得:策略模式(Strategy Pattern) 接口的用处(之一)
    延时至调用时获取被反序列化数据的类型的实现
    权限设计中的"依赖颠倒"
    CSCMSV1终于上线内测了[广告贴]
    Windows Service 使用参数安装DEMO,可使用控制台启动方式进行调试,服务安装完后立即启动
    使用assembly.GetExportedTypes();方法时引发动:态程序集中不支持已调用的成员的异常
  • 原文地址:https://www.cnblogs.com/gandoufu/p/9290205.html
Copyright © 2011-2022 走看看