博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
逐行解释和整体解释的理解
阅读量:4320 次
发布时间:2019-06-06

本文共 1927 字,大约阅读时间需要 6 分钟。

首先跟着笔者的思路读以下的代码 片段
<一>
>>> a = 10.1>>> b = 10.1 >>> a is b False 返回false说明a和b不是指向了同一个对象,可以查看id进行判断 >>> id(a) 140475784803760 >>> id(b) 140475784803736 片段
<二>
接着看以下这一段的代码 >>> (10.1) is (10.1) True >>> def foo(): ... a = 10.1 ... b = 10.1 ... return a is b ... >>> foo() True
片段
<三>

趣者可以尝试着用的CPython环境里执行下面的代码:

def foo():  a = 10.1 b = 10.1 return a is b print(foo())

而结果总是True。

片段
<四>

In [45]: def demo1():

...: return 10.2
...:

In [46]: def demo2():

...: return 10.2
...:

In [47]:

In [47]: print(demo1() is demo2())

False

In [48]:

而结果总是False。

 

 

《帮助理解文档介绍》

 

背景知识

CPython的代码的“编译单元”是函数——每个函数单独编译,得到的结果是一个PyFunctionObject对象,其中带有字节码、常量池等各种信息。Python的顶层代码也被看作一个函数。函数之间有嵌套时,外层函数的代码并不包含内层函数的代码,而只是包含创建出内层函数的函数对象(PyFunctionObject)的逻辑。(这里的编译单元跟之前提到过的代码块可以理解为同一个概念--"都是编译时的基本单位")

 

在同一个编译单元(PyFunctionObject)里出现的值相同的常量,只会在常量池里出现一份,一定会对应到运行时的同一个对象。所以在foo()的例子里,a和b都从同一个常量池项获取值;

在不同的编译单元里,值相同的常量不一定会对应到运行时的同一个对象(小整数对象池 -5~256 之间的数在不同的编译单元里,值相同的常量会对应到同一个对象),

代码帮助理解:

 

In [48]: a = 255

In [49]: def demo():

...: b = 255
...: c = 255
...: print(a is b)
...: print(b is c)
...:

In [50]: demo()

True
True

In [51]:

注:255为小整数对象池之内的数 所以 不同的编译单元 执行的结果为true

 

 

In [51]: a = 257

In [52]: def demo():

...: b = 257
...: c = 257
...: print(a is b)
...: print(b is c)
...:

In [53]: demo()

False
True

In [54]:

注:257不是小整数对象池范围的的数据  a和b 为两个编译单元所以结果为false  这里可以观察到  在同一个编译单元里  同样的整数(b和c)只会创建一份所以返回True

 

 

“逐行解释”?

其实在CPython的交互式解释器(例如python命令不指定参数时)里,每输入一行可以立即执行的代码,Python解释器就会把一行当作一个编译单元来编译到字节码并解释执行;如果输入的代码尚未构成一个完整的单元,例如函数声明或者类声明,则等到获得了完整单元的输入后再当作一个编译单元来处理。

所以当我们在CPython的交互式解释器中分别输入"a = 10.1"、"b = 10.1"这两行时,它们分别被当作一个编译单元处理,其中的常量池没有共享,常量池项也都是各自新创建的,所以会得到a is b为False的结果。

而在同一环境里输入"(10.1) is (10.1)"时,这一行被看作一个编译单元,其中两次对10.1这个常量的使用都变成了对同一对象的引用,因而is的结果为True。

例:

In [57]: 10.1 is 10.1

Out[57]: True 

当把 一下代码放到同一个py文件里去执行的时候 两行代码就会处于同一个编译单元中,a is b就会是True。 同一个代码块(编译单元)共享同一个常量池

 a = 10.1

 b = 10.1

print(a is b)

>>>True

 

转载于:https://www.cnblogs.com/kayb/p/7153025.html

你可能感兴趣的文章
Java 笔记07
查看>>
POJ 3041 Asteroids (二分匹配)
查看>>
响应式布局
查看>>
缺陷跟踪系统Mantis之安装篇(转载)
查看>>
UI1_UITableViewHomeWork
查看>>
简单解析依赖注入(控制反转)在Spring中的应用
查看>>
NoSQL 简介及什么是AICD
查看>>
hibernate+mysql的连接池配置
查看>>
条件运算符 (?:)
查看>>
javascript Array(数组)
查看>>
HDU1518 Square 【剪枝】
查看>>
桥接模式
查看>>
android windows 上JNI编程
查看>>
PHP中可变变量到底有什么用?
查看>>
谈一谈最近关闭的Kindle人论坛
查看>>
android java 与C 通过 JNI双向通信
查看>>
javascript:另一种图片滚动切换效果思路
查看>>
获取css的属性值
查看>>
Win32_NetworkAdapterConfiguration
查看>>
Flash:DisplayObject的transform/matrix的潜规则、小bug
查看>>