1,“相等”与“相同”

  我们先赋值三个变量a, b, c:

  a = [1, 2, [1, 2]]

  b = [1, 2, [1, 2]]

  c = a

  判断一下‘相等’:

  a == b  返回 True

  a == c  返回 True

  b == c  返回 True

  判断一下‘相同’:

  a is b  返回 False

  b is c  返回 False

  a is c  返回 True

  这里说明了,‘相等’和‘相同’是不一样的。==是一个比较运算符,用来比较对象值是否相等,若相等返回True,否则返回False。

  python官方手册解释的is为object identity,其实就是判断是否为同一个对象,也就是其储存地址是否相同,相同返回True,否则返回False。

  所以说a is b的等价形式是 id(a) == id(b)。

  这里面没有涉及到拷贝,a 与b就是单纯的建造两个变量,‘恰巧’它们的值相等。

2.浅拷贝与深拷贝

  浅拷贝和深拷贝是相对引用来说的。

  上例中c = a,将a的值附给c,那么a与c不仅值是相等的,其内存地址也是相同的,换句话说这就是一个对象的两个名字而已。这就是引用

  实现浅拷贝最方便的就是使用切片了:

  d = a[:]

  当然copy模块中的copy函数也可以实现浅拷贝:

  d = copy.copy(a)

  这里的d就是a的浅拷贝;

  a == d  返回 True

  a is d   返回 False

  a[2] == d[2]  返回 True

  a[2] is d[2]   返回 True

  从这里可以看出,变量a和d的值相等,内存地址不同;但是其元素的地址相同;这就是“浅”的含义了,重新定义了外层的内存地址,但是其元素地址未变。

  对于深拷贝:

  e = copy.deepcopy(a)

  a == e  返回 True

  a is e   返回 False

  a[2] == e[2] 返回 True

  a[2] is e[2]  返回 False

  与浅拷贝不同,深拷贝将元素的内存地址也变了。也就是说深拷贝的结果与之前的变量已经“没关系啦”就像前面提到的变量a和b一样。

3.不可变对象

  

  

最新文章

  1. C#获取文本文件的编码,自动区分GB2312和UTF8
  2. resin4的初次配置与使用
  3. 从《BLAME!》说开去——新一代生产级卡通真实感混合的渲染方案
  4. array_count_values函数
  5. CCJ PRML Study Note - Chapter 1.6 : Information Theory
  6. Python:字符串
  7. uiautomator做自动化的过程
  8. DependencyProperty
  9. SQLCMD的用法,使用CMD 执行sql语句
  10. SQL Server索引的维护 - 索引碎片、填充因子 <第三篇>
  11. 【WinRT】【译】【加工】在 XAML 中制作圆形图片
  12. Codeforces 479E Riding in a Lift(dp)
  13. Phpstorm中使用SFTP
  14. H5如何解监听页面退出需求???
  15. Error - The debugger's worker process (msvsmon.exe) unexpectedly exited.
  16. 微信公众平台开发教程Java版(六) 事件处理(菜单点击/关注/取消关注)
  17. python 0,1行列问题
  18. token的使用流程
  19. nginx 的 upstream timed out 问题
  20. 转载【TP3.2】:使用PHP生成二维码

热门文章

  1. 10-okHttp的同步与异步
  2. Swift 小技巧 || 老偏方
  3. 【C++】:STL迭代器使用---[容器::iterator iter;]
  4. 9.13 h5日记
  5. txt写入时报错出现:正由另一进程使用,原来是多此一举的操作
  6. C# Contains 包含空字符串的问题
  7. this指针 new 和delete
  8. HTML JavaScript语法练习
  9. js对象(BOM部分/DOM部分)
  10. TP 真阳性 TN FP FN