Day2-Python基础2---浅copy、深copy的差别

浅copy

首先我们来看下面一段代码:

 1  1 >>> names = ["maqing"," peilin"," xiaoming"," lilei"," hanmeimei",["maqing","wangchuan","lilong"]]
 2  2 >>> names2 = names.copy()
 3  3 >>> print(names)
 4  4 [‘maqing‘, ‘ peilin‘, ‘ xiaoming‘, ‘ lilei‘, ‘ hanmeimei‘, [‘maqing‘, ‘wangchuan‘, ‘lilong‘]]
 5  5 >>> names[2] = "小明"
 6  7 >>> print(names)
 7  8 [‘maqing‘, ‘ peilin‘, ‘小明‘, ‘ lilei‘, ‘ hanmeimei‘, [‘maqing‘, ‘wangchuan‘, ‘lilong‘]]
 8  9 >>> print(names2)
 9 10 [‘maqing‘, ‘ peilin‘, ‘ xiaoming‘, ‘ lilei‘, ‘ hanmeimei‘, [‘maqing‘, ‘wangchuan‘, ‘lilong‘]]
10 11 >>> names[-1][2] = "李龙"
11 12 >>> print(names)
12 13 [‘maqing‘, ‘ peilin‘, ‘小明‘, ‘ lilei‘, ‘ hanmeimei‘, [‘maqing‘, ‘wangchuan‘, ‘李龙‘]]
13 14 >>> print(names2)
14 15 [‘maqing‘, ‘ peilin‘, ‘ xiaoming‘, ‘ lilei‘, ‘ hanmeimei‘, [‘maqing‘, ‘wangchuan‘, ‘李龙‘]]

第一步:修改names中‘xiaoming‘的值为中文"小明",输出列表发现只有names中修改了,但names2中没有修改,符合copy的性质。

第二步:修改names中二级列表"lilong"的值为"李龙",输出names和names2,我们发现‘lilong‘的值都改为中文了,貌似这不符合copy的性质。

这种copy我们称之为浅copy

浅copy的方法有三种:

  • 使用切片[:]操作
  • 使用工厂函数(如list/dir/set)
  • 使用copy模块中的copy()函数
1 person = [‘name‘,[‘saving‘,100]]
2 p1 = copy.copy(person)
3 p2 = person[:]
4 p3 = list(person)

深copy

 1 >>> import copy
 2 >>> names = ["Will", 28, ["Python", "C#", "JavaScript"]]
 3 >>> names2 = copy.deepcopy(names)
 4 >>> names[1] = ‘27‘
 5 >>> print(names)
 6 [‘Will‘, ‘27‘, [‘Python‘, ‘C#‘, ‘JavaScript‘]]
 7 >>> print(names2)
 8 [‘Will‘, 28, [‘Python‘, ‘C#‘, ‘JavaScript‘]]
 9 >>> names[2][1] = "Ruby"
10 >>> print(names)
11 [‘Will‘, ‘27‘, [‘Python‘, ‘Ruby‘, ‘JavaScript‘]]
12 >>> print(names2)
13 [‘Will‘, 28, [‘Python‘, ‘C#‘, ‘JavaScript‘]]

总结

本文介绍了对象的赋值和拷贝,以及它们之间的差异:

  • Python中对象的赋值都是进行对象引用(内存地址)传递
  • 使用copy.copy(),可以进行对象的浅拷贝,它复制了对象,但对于对象中的元素,依然使用原始的引用.
  • 如果需要复制一个容器对象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝
  • 对于非容器类型(如数字、字符串、和其他’原子’类型的对象)没有被拷贝一说
  • 如果元祖变量只包含原子类型对象,则不能深拷贝,看下面的例子

   

时间: 2024-08-23 15:22:33

Day2-Python基础2---浅copy、深copy的差别的相关文章

python 复制 浅copy 深copy 的区别

1.浅copy: 外层添加元素时, 浅拷贝c不会随原列表a变化而变化:内层list添加元素时,浅拷贝c才会变化. 2.深copy: 无论原列表a如何变化,深拷贝d都保持不变. 3.赋值: 赋值对象随着原列表一起变化 深拷贝:只有一种形式,copy模块中的deepcopy函数.     和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素.     深拷贝出来的对象是一个全新的对象,不再与原来的对象有任何关联. import copy a = [1,2,3,4,5,['a','b'],6]

Python之路,Day2 - Python基础2

Python之路,Day2 - Python基础2 本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 1 names = ['Alex',"Tenglan",'Eric'] 通过下标访问列表中的元素,下标从0开始计数 1 2 3 4 5 6 7 8 >>> names[0] 'Alex' >>> na

python 全栈 python基础 (四)运算 copy

字符串的格式化 在字符串中插入 %s ,作为占位符,后边儿再定义插入变量. 算术运算 % 取模   判断奇偶数 / 除法   有小于号 // 取整除  返回整数部分 逻辑运算 and or not 'str'.isdigit() 是判断一个字符串能否转换成数字 布尔运算 以下几种情况为假! []空列表 {}空字典 ()空元组,空集合 ''空字符串 0 位运算 == 二进制运算 列表的copy   浅copy与深copy的关系  用在内存占位的 id 理解! 字典 中的 fromkeys() 从序

python3 完全理解赋值,浅copy,深copy 通过地址详细理解~

额...老规矩,先来一天NLP再说,也没几条了. 十,在任何一个系统里,最灵活的部分是最能影响大局的部分 灵活便是有一个以上的选择,选择便是能力,因此最灵活的人便是最有能力的人. 灵活来自减少只相信自己的一套信念,价值和规条,而多凭借观察运用环境所提供的其他条件. 灵活是使事情更快有效的的重要因素,因此,亦是人生成功快乐的重要因素. 灵活亦是自信的表现,自信越不足,坚持某个模式的态度会越强硬. 容许不同的意见和可能性,便是灵活. 在一个群体中,固执使人紧张,灵活使人放松. 灵活不代表放弃自己的立

Python day2 ---python基础2

本节内容 列表. 元组操作 购物车程序 字符串操作 字典操作 3级菜单 作业(购物车优化) 1. 列表操作 1.定义列表names = ['Alex',"Tenglan",'Eric'] 2.追加 3.插入 4.修改 5.打印元素 6.切片        7.索引(获取下标) 和统计 8.删除 和 清除         9.翻转和排序 10.扩展 11.Copy 12.浅copy ,深copy 13.循环,打印列表 14.步长切片 2.元组操作 元组其实跟列表差不多,也是存一组数,只不

python基础之浅复制与深复制

关于列表.字典.元组的浅复制和深复制,数字和字符串没有浅复制和深复制一说.下面我直接用代码来体现: 1 import copy 2 3 names = ['Cahill','Teenglan','Eric','Peggie','Aalto','Baal','Sadie', 4 'Gage','Hagan','Jack','Kaley','Mabel','Lacy','Nadine','Pace','Amy'] 5 6 #浅复制 7 names2 = names.copy() 8 names2[1

Day2 - Python基础(列表,元组等)

本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表示例 1 names = ["ZhangYang"," Guyun"," Xiangpeng"," XuLiangChen"] 通过下标访问列表中的元素,下标从0开始计数 1 >>> names[0] 2 'Zh

Python之路,Day2 - Python基础,列表,循环

1.列表练习name0 = 'wuchao'name1 = 'jinxin'name2 = 'xiaohu'name3 = 'sanpang'name4 = 'ligang' names = "wuchao jinxin xiaohu sanpang ligang"a=['wuchao','jinxin','xiaohu','sanpang','ligang'] #增删改查#增 切片print(a[1:])#取到最后print(a[1:-1])#取到倒数第二值print(a[1:-1:

Python自动化开发,Day2 - Python基础2

本章内容 holle word 变量 字符编码 用户输入 模块初始 数据类型 数据运算 if......else 一.第一个程序 holle word 1 #! /usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author:Lyon 4 5 print("holle word") 在Python3.5.2环境下执行,执行结果如下: 1 Python 3.5.2 (v3.5.2:4def2a2901a5,Jun 25 2016, 22:18

Studing Day2 - python基础2

11.30 一.模块 sys 模块 sys.path是python的搜索模块的路径集,是一个list sys.argb是打印相对路径 os模块 os.system("dir") a = os.system("dir")    # 调用是直接输出到屏幕上,并不会保存下来 print('-->', a)           # 输出0,代表执行成功 os.mkdir("new_dir")    # 在当前目录创建目录 创建模块 二.数据类型 1