`
simohayha
  • 浏览: 1403383 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

操作符is的1个诡异问题

阅读更多
请看这段程序
a = 0
b = 0
while a is b:
    a += 1
    b += 1
print id(a), a
print id(b), b

猜猜结果,呵呵结果是
13013836 257
13013812 257
原因在这里:

引用
This is really hardcoded limit in the current CPython implementation
The interpreter preallocates numbers from 0 to 256.


大家可以看下intobject.c的有关这部分的源码:
#ifndef NSMALLPOSINTS
#define NSMALLPOSINTS		257
#endif
#ifndef NSMALLNEGINTS
#define NSMALLNEGINTS		5
#endif
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
/* References to small integers are saved in this array so that they
   can be shared.
   The integers that are saved are those in the range
   -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
*/
static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
#endif
#ifdef COUNT_ALLOCS
int quick_int_allocs, quick_neg_int_allocs;
#endif

呵呵,一目了然吧.
这边给我们的教训就是判断数字相等不要用 is操作符,哈哈.
分享到:
评论

相关推荐

    实现操作符重载 实现操作符重载

    在C++中,每个运算符都是一个函数,当我们对自定义类型进行运算时,编译器会自动寻找合适的操作符重载函数来执行运算。例如,我们可以为类的实例定义"+"运算符,使得两个实例可以通过"+"相加。 二、操作符重载的...

    C++ 操作符重载

    操作符重载并不创建新的操作符,而是让一个操作符可以处理不同类型的操作数或者执行不同的操作。重载是通过函数实现的,这些函数通常作为类的成员函数或友元函数。例如,我们可以为自定义的复数类重载加法操作符"+...

    C++程序纠正C+程序中的操作符《和》用法错误,这两个操作符与cin和cout配合使用

    C++ programming language 中,操作符《和》是非常重要的输入/输出流操作符,这两个操作符经常与 cin 和 cout 配合使用。但是,在编程过程中,开发者可能会遇到《和》操作符的用法错误,例如在 cin 和 cout 中错误地...

    VHDL操作符详细列表

    * `/` 除法操作符,用于将一个数字信号除以另一个数字信号。 * `MOD` 取模操作符,用于计算两个数字信号的模。 * `REM` 取余操作符,用于计算两个数字信号的余数。 * `` 乘方操作符,用于将一个数字信号提升到某个幂...

    操作符学习案例

    2. **赋值操作符**:用于将一个值赋给变量,例如`=`, `+=`, `-=`等。例如: ```java a = b; // 将b的值赋给a a += b; // 等同于 a = a + b ``` 3. **比较操作符**:用于比较两个值,如`==`(等于)、`!=`(不等于)...

    Linq操作符27个常用说明.docx

    以上就是 LINQ 中常用的 27 个操作符的主要功能及其应用场景。这些操作符极大地简化了 .NET 中的数据处理流程,使得开发者能够更加高效地编写代码。通过灵活运用这些操作符,你可以轻松地实现各种复杂的数据操作需求...

    类应用举例 操作符重载

    操作符重载是面向对象编程中的一个重要概念,它允许程序员为类定义特定的操作符的行为,使得这些操作符能够用于类的对象上。 描述中首先对“类”进行了定义,类可以理解为一系列具有相同属性和行为的数据集合。类在...

    linq标准查询操作符

    此外,`SelectMany`操作符用于将多层嵌套的序列展开为一个单一的序列。在示例中,`SelectMany`结合`from`子句,从每个员工的订单集合中选取订单,将所有订单合并成一个序列。 接下来是限制操作符`Where`,它用于...

    Swift视频教程:基本操作符系列 选并操作符

    这个操作符允许你在多个条件中选择满足其中之一即可。 接下来,我们有`^`操作符,它表示“异或”操作。当且仅当两个布尔值不同时,`^`操作符返回`true`。例如,`true ^ true`返回`false`,而`true ^ false`返回`...

    C++编写的操作符重载实例

    通过这个操作符,用户可以像输入基本数据类型一样输入分数。 ```cpp istream& operator>>(istream& istr, Franction& x) { char ch; cout ; istr >> x.nume >> ch >> x.deno; if (x.deno == 0) {cerr 分母不能为...

    C++操作符详解

    比较操作符用于比较两个值,并返回一个布尔结果。这些操作符包括等于(==)、不等于(!=)、小于(<)、大于(>)、小于等于()和大于等于(>=)。例如,`a == b` 检查a是否等于b。 四、逻辑操作符 逻辑操作符包括逻辑与(&&)、...

    第5节-操作符详解.pdf

    单目操作符只作用于一个操作数,常见的有: - **逻辑非 (`!`)**: 如果操作数为非零,则结果为0;否则为1。 - **负值 (`-`)**: 改变数值的正负号。 - **正值 (`+`)**: 不改变数值的正负号。 - **取地址 (`&`)**: ...

    使用操作符setw 对数据进行格式输出时,需要包含______ 头文件.pdf

    在C++编程语言中,setw操作符是一个非常有用的流操纵符,可以帮助我们实现格式输出。但是,为了使用setw操作符,我们需要包含iostream头文件。只有包含了iostream头文件,我们才能使用setw操作符来实现格式输出。

    MATLAB 中的常用操作符

    在MATLAB这一强大的数学计算与可视化工具中,掌握其丰富的操作符系统对于高效地进行数据分析、算法开发以及科学计算至关重要。以下是对MATLAB中常见操作符的深入解析,旨在为用户提供一个全面的理解框架。 ### 算术...

    ZEMAX评价函数中操作符汇总

    - EFXL/EFLY: 控制X和Y平面上的有效焦距,尤其在非旋转对称系统中,这两个操作符可以调整中间镜组的焦距。 - POWR: 光焦度,衡量一个表面的聚焦能力,仅适用于标准表面。 - PIMH: 近轴像高,是近轴成像时像平面上...

    C++操作符的优先级

    C++操作符的结合性指的是在多个操作符同时出现时,它们的执行顺序。C++语言中,操作符的结合性有两种: * 左结合性:从左到右执行,例如加法和减法操作符。 * 右结合性:从右到左执行,例如赋值操作符。 操作符的...

    C++操作符重载

    对于自定义类型,例如一个计数器类,我们需要重载这两个操作符以实现自增或自减的行为。 5. **注意事项**: - 操作符重载不应改变操作符的语义,即它们应该保留其基本的逻辑意义。 - 不要为了重载而重载,只有当...

    操作符重载详解

    )只需要一个操作数,而双目运算符(如+,-,*,/)需要两个操作数。 **操作符重载的注意事项:** 1. **不能创建新的操作符**:C++不允许我们创建新的操作符,只能重载已有的。 2. **不能改变操作符的优先级和结合...

    学习rxjs操作符

    它提供了一个核心类型 Observable,附属类型 (Observer、 Schedulers、 Subjects) 和受 [Array#extras] 启发的操作符 (map、filter、reduce、every, 等等),这些数组操作符可以把异步事件作为集合来处理

Global site tag (gtag.js) - Google Analytics