python中的3个常见操作符is、id、==,三个的使用方法和应用场景不近相同,有各自适合的应用场景
is:用于比较两个对应是否是同一个引用
==:用于比较两个之是否相同
id:用于获取对象的内存地址
id(5)
1492768624
a = 4
b = 4
a == b
True
a is b
True
a = 257
b = 257
a == b
True
a is b
False
两个人数值对象都是4的时候他们的值相等,他们的引用也相同,但是当两个对象值为257的时候,他们的引用就不相同了,为什么出现这种原因?
这是因为python的内存管理机制,对于数值而言,在[-5,257)之间的数值对象他们共用一个对象,即都指向一个内存地址。
a = 4
b = 4
id(a)
1492768608
id(b)
1492768608
可见在内存中的地址是一样的,一个对象,[-5,257)之间的数值是已经建好的,即使我们所谓的创建,对于程序而言也不是创建只不过增加了一个引用。
深拷贝、浅拷贝
深拷贝是在内存中在创建一个相同的对象,而浅拷贝是给对象增加一个引用,用一个比喻来形容:一个txt文本,在桌面创建快捷方式是浅拷贝,复制这个txt文件是深拷贝,那么删除一个快捷方式不会影响到原文件,但是删除一个原文件的复制文件,那么就是真的删除了一个文件。
python中copy模块提供了对象拷贝的深拷贝和浅拷贝模式,分别是copy.deepcopy()、copy.copy()。
a = 'dsasdsd'
b = copy.copy(a)
c = copy.deepcopy(a)
id(a)
80379424
id(b)
80379424
id(c)
80379424
上面案例中创建了一个字符串对象a,通过浅拷贝和深拷贝分别创建了另两个对象bc,那么他们的内存地址为什么是一样的。
这是受益于python的共享机制,对于不可变的单个字符、不可变字符串是共享对象,相同的对象是指向一个内存地址。
更对机制等待各位深入。