系列文章目录
Python 零基础到入门数据类型篇
Python基础 字符串常用方法篇
Python基础 列表常用方法篇
Python基础 字典常用方法篇
Python基础 ' 深拷贝 浅拷贝原理深度解析篇
文章目录
前言
今天主要跟大家讲一下 关于is == 符号的使用 与深拷贝、浅拷贝原理深度解析
一、is 与 ==比的是什么?其中 ==符号比较的是两个变量的值,而is 是比较两个变量引用的地址是否一致,我们看图:
i1 = 1
i2 = 1
print(i1==i2)
True
print(id(i2))
140703233152784
print(id(i1))
140703233152784
通过图片我们可知,两个值是相等的,两个值的id也是相同的,什么是id呢?就是这个变量的身份标识,内存空间的引用地址。这里我们要注意,由于python提前为一些数值做了缓存,就是引用这些变量不会开辟新的内存地址,而是使用原有的。所以会看到用数值两个变量 的值与id都是相等的,但是如果我们换成其他类型那就不一样了,我们再用其他类型举个例子
a = [1,2,3]
b = [1,2,3]
print(True)
print(id(a))
1378649455360
print(id(b))
1378649455360
print(a is b)
False
通过图片可知其内 容依然是相等但是 id变了,就是引用的地址不一样了。
二、赋值、深拷贝、浅拷贝的区别
(1)什么是赋值呢?举个简单的例子,我和我老婆家里一共有10块钱,我和我老婆都可以去这个钱包里拿钱或者存钱,这就是赋值。[258,123]列表就是我们家的钱包,i1 和i2 分别代表我和我老婆
代码如下:
i1 = 258 i2 = i1 print(i1==i2) True print(i1 is(i2)) True print(id(i2)) 140703233152784 print(id(i1)) 140703233152784
(2)什么是浅拷贝呢?我们家里除了10块钱,我自己还偷偷藏了5块钱小金库,家里的10块钱的存钱与取钱逻辑不变,但是我自己小金库的增加和减少只取决于我自己 。这里的子列表['small_money']就是我的小金库
i1 = [258,123,['small_money']]
i2 = list(i1)
print(i1==i2)
True
print(i1 is(i2))
False
print(id(i2))
2528091307392
print(id(i1))
2528090936576
要想创造小金库有几种方法:
# 通过对象本身的构造器
i1 = [258,123,['small_money']]
i2 = list(i1)
print(i1==i2)
True
print(i1 is(i2))
False
print(id(i2))
1859946871872
print(id(i1))
1859946501376
# 通过切片实现浅拷贝
l1 =[1,2,3]
l2 =l1[:]
print(l1==l2)
True
print(l1 is(l2))
False
print(id(l2))
1859946862912
print(id(l1))
1859946863360
# 通过copy方法实现浅拷贝
l1 =[4,5,6]
l2 =l1.copy()
print(l1==l2)
True
print(l1 is(l2))
False
print(id(l2))
1859946863360
print(id(l1))
1859946870592
(3) 什么是浅拷贝呢?什么是深拷贝呢?老婆发现了我的小金库,一气之下把家里的15元巨资 变成2份,没人7.5元 各自花各自的
import copy
i1 = [258,123,['small_money']]
i2 = copy.deepcopy(i1)
print(i1==i2)
True
print(i1 is(i2))
False
print(id(i2))
1236758756864
总结
提示:这里对文章进行总结: