python3 列表的赋值和深浅拷贝
一、赋值操作并没有创建新列表,只是内存地址的赋值操作,两个列表的内存地址是一样的
= 赋值操作并不会创建新对象,只是把一个变量的内存地址赋值给另一个变量
old_lst = [1, 2, 3]
new_lst = old_lst
print(id(old_lst))
print(id(new_lst))
print("old_lst:", old_lst)
print("new_lst:", new_lst)
old_lst.append(666)
print("old_lst:", old_lst)
print("new_lst:", new_lst)
执行结果:
32645384
32645384
old_lst: [1, 2, 3]
new_lst: [1, 2, 3]
old_lst: [1, 2, 3, 666]
new_lst: [1, 2, 3, 666]
二、 浅拷贝:copy浅拷贝,只拷贝一层内容,复制一个表面,更深层次的内容,只拷贝一个内存地址。浅拷贝可以通过两种方式实现,一种是切片赋值,一种是copy()函数
拷贝的意义:快速的创建对象。
1.1.列表切片赋值 两个列表的内存地址不一样(简单的列表,列表元素不包括列表类型)
old_lst = [1, 2, 3]
new_lst = old_lst[:]
print(id(old_lst))
print(id(new_lst))
print("old_lst:", old_lst)
print("new_lst:", new_lst)
old_lst.append(666)
print("old_lst:", old_lst)
print("new_lst:", new_lst)
执行结果:
43655432
43656456
old_lst: [1, 2, 3]
new_lst: [1, 2, 3]
old_lst: [1, 2, 3, 666]
new_lst: [1, 2, 3]
1.2.列表切片赋值 两个列表的内存地址不一样(复杂些的列表,列表元素包括列表类型)
old_lst = [1, [2, 3]]
new_lst = old_lst[:]
old_lst[1].append(666)
print(id(old_lst))
print(id(new_lst))
print("old_lst:", old_lst)
print("new_lst:", new_lst)
执行结果:
43524296
43525384
old_lst: [1, [2, 3, 666]]
new_lst: [1, [2, 3, 666]]
2.1.浅拷贝,只拷贝一层,copy() 两个列表的内存地址不一样(简单的列表,列表元素不包括列表类型)
old_lst = [1, 2, 3]
new_lst = old_lst.copy()
print(id(old_lst))
print(id(new_lst))
print("old_lst:", old_lst)
print("new_lst:", new_lst)
old_lst.append(666)
print("old_lst:", old_lst)
print("new_lst:", new_lst)
执行结果:
43524360
43525384
old_lst: [1, 2, 3]
new_lst: [1, 2, 3]
old_lst: [1, 2, 3, 666]
new_lst: [1, 2, 3]
2.2.浅拷贝,只拷贝一层,copy() 两个列表的内存地址不一样(复杂些的列表,列表元素包括列表类型)
old_lst = [1, [2, 3]]
new_lst = old_lst.copy()
old_lst[1].append(666)
print(id(old_lst))
print(id(new_lst))
print("old_lst:", old_lst)
print("new_lst:", new_lst)
执行结果:
43720904
43721992
old_lst: [1, [2, 3, 666]]
new_lst: [1, [2, 3, 666]]
三、深拷贝:把内容完全的复制一份
import copy
copy.deepcopy()
两个列表的内存地址不一样,两个列表没有任何的关联了
1.1(简单的列表,列表元素不包括列表类型)
import copy
old_lst = [1, 2, 3]
new_lst = copy.deepcopy(old_lst)
print(id(old_lst))
print(id(new_lst))
print("old_lst:", old_lst)
print("new_lst:", new_lst)
old_lst.append(666)
print("old_lst:", old_lst)
print("new_lst:", new_lst)
执行结果:
37430600
37446088
old_lst: [1, 2, 3]
new_lst: [1, 2, 3]
old_lst: [1, 2, 3, 666]
new_lst: [1, 2, 3]
1.2(复杂些的列表,列表元素包括列表类型)
import copy
old_lst = [1, [2, 3]]
new_lst = copy.deepcopy(old_lst)
old_lst[1].append(666)
print(id(old_lst))
print(id(new_lst))
print("old_lst:", old_lst)
print("new_lst:", new_lst)
执行结果:
43787592
43804168
old_lst: [1, [2, 3, 666]]
new_lst: [1, [2, 3]]
四、函数的默认值参数类型如果是可变类型的,注意,这个参数是共享的(大坑哦)(不可变参数:str bool int tuple)
1.1 实例一
def func(lst=[]):
lst.append(123)
print(id(lst), lst) func()
func()
func()
执行结果:
36175624 [123]
36175624 [123, 123]
36175624 [123, 123, 123]
1.2 实例二
函数的默认值参数类型如果是可变类型的,注意,这个参数是共享的(大坑哦)
def func(lst=[]):
lst.append(123)
print(id(lst), lst) func()
func([])
func()
执行结果:
43384584 [123]
43394440 [123]
43384584 [123, 123]
python3 列表的赋值和深浅拷贝的更多相关文章
- python——赋值与深浅拷贝
初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...
- 【python】变量的赋值、深浅拷贝
python——赋值与深浅拷贝 https://www.cnblogs.com/Eva-J/p/5534037.html 啥都不说,看这个博主的文章!
- python基础知识5——赋值与深浅拷贝——整数和字符串,列表元组字典
深浅copy 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 import copy 2 # ######### 数字.字符串 #### ...
- python--关于赋值与深浅拷贝的认识
作为一个自学python的小白,平时用到深浅拷贝的机会很少,因此对其也是一知半解.但是,作为一个立志成为后端工程狮的男人,眼里揉不了沙子,于是专门花时间补了补课,在此记录一下学习心得. 在讲深浅 ...
- python直接赋值、深浅拷贝实例剖析
根据数据类型分为两部分进行剖析: int.str类型 list.tuple.dict类型等 1. int.str类型 [int类型实例] >>> import copy ...
- python中的“赋值与深浅拷贝”
Python中,赋值与拷贝(深/浅拷贝)之间是有差异的,这主要源于数据在内存中的存放问题,本文将对此加以探讨. 1 赋值(添加名字) 赋值不会改变内存中数据存放状态,比如在内存中存在一个名为data的 ...
- python语法基础-基础-赋值与深浅拷贝
##################################### 预备知识一——python的变量及其存储 在详细的了解python中赋值.copy和deepcopy之前,我们还是要花一点时 ...
- python3【基础】-赋值与深浅拷贝
一.Python的变量及其存储 在高级语言中,变量是对内存及其地址的抽象.对于python而言,python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址, ...
- python列表中的赋值与深浅拷贝
首先创建一个列表 a=[[1,2,3],4,5,6] 一.赋值 a=[[1,2,3],4,5,6]b=aa[0][1]='tom'print(a)print(b)结果: [[1, 'tom', 3], ...
随机推荐
- C# 单例模式和窗体的单例打开方法
第一种最简单,但没有考虑线程安全,在多线程时可能会出问题,不过俺从没看过出错的现象,表鄙视我…… public class Singleton{ private static Singleton ...
- JDK动态代理与CGLib动态代理相关问题
导读: 1.JDK动态代理原理是什么?为什么不支持类的代理? 2.JDK动态代理实例 3.CGLib代理原理是什么? 4.CGLib代理实例 5.JDK动态代理与CGLib代理的区别是什么? 6.总结 ...
- java反射与动态代理的理解
一.什么是反射机制? 反射的官方定义是这样的:在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象 ...
- js查询数组或者List类型是否包含某个元素
方法一:arr.indexOf(某元素) 实际用法:if(arr.indexOf(某元素) > -1){//则包含该元素} 例: var fruits = ["Banana" ...
- HDU4278
Faulty Odometer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- HDU4825(01字典树)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total S ...
- table垂直居中
th,td{ text-align:center;/** 设置水平方向居中 */ vertical-align:middle/** 设置垂直方向居中 */ }
- java源文件与类
一个源文件可以包含多个类, 编译的时候,每一个类生成一个字符码文件, 源文件名可以和类名不一致,但字符码文件与类名一致, 如果类是public(公共类),源文件名必须与类名一致 命名规则:源文件的路径 ...
- chrome 远程调试相关问题
1.使用chrome remote debug时打开inspect时出现一片空白 2.如何不用FQ可以享受Chrome for android的远程调试功能 3.chrome://appcache-i ...
- Apex简介
Apex特点 Salesforce为开发者提供了Apex语言.它是一种语法上类似于Java的编程语言,有以下特点: 面向对象 完全在云端处理,包括保存.编译.执行 强类型 大小写不敏感(这一点和其他大 ...