美文网首页
Python 基础 | 让人迷糊的数字内存地址

Python 基础 | 让人迷糊的数字内存地址

作者: VTester | 来源:发表于2022-10-22 01:30 被阅读0次

    迷幻的结果

    关键词is用来判定两个变量是不是同一个对象。

    它们如果在内存中是同一个地址,就返回True,否则返回False。

    如果在内存中不是同一个地址,就算是值是一样的,也会返回返回False。

    在交互式Python下,运行这段代码:

    >>> a = 198 
    >>> b = 198 
    >>> a is b
    True
    

    打印结果是True,说明a和b是同一个对象。

    再看这段:

    >>> a = 257 
    >>> b = 257 
    >>> a is b
    False
    

    打印结果竟然是False,说明a和b不是同一个对象。

    注意:必须在交互式Python下运行才会有这样的结果,后面会解释为什么。

    这就奇怪了,为什么198是同一个对象,257就不是了呢?

    再看这个:

    >>> a = 257;b=257  #两个赋值语句写在同一行,用分号隔开
    >>> a is b
    True
    

    打印的结果竟然又成了True。WTF????


    解惑

    上面的诡异现象是由于Python解释器的优化造成的。

    1. Python把一定常见的数字(-5到256)放在一个统一的地方,如果程序中用到了就会直接使用这个统一的地方的数字。198属于这个范围,所以不管我们定义多少不同的变量,实际上都是用的这同一个,放在内存中是同一个地方。

    2. 而257不属于上面的范围,虽然a和b都是257。定义新的变量的时候,内存中会开辟一个新的地址保存257。我们用is是比较的内存地址,所以是False。如果我们用==做比较,他们比较的是值,就是相同的。

    3. 那第三段怎么又是True了呢?那是因为Python的解释器还有一个优化,如果两个变量在同一个代码块中(在例子中是同一行,所以肯定是同一个代码块),那么为了节省空间,值相同的变量也会共用同一个内存空间。所以就又是True了。

    如果我们把这些代码放在同一个Python文件中执行,也被认定为同一个代码块,也会共用同一个变量。

    a = 257
    b = 257
    print(a is b)
    

    执行结果为True。

    相关文章

      网友评论

          本文标题:Python 基础 | 让人迷糊的数字内存地址

          本文链接:https://www.haomeiwen.com/subject/slxizrtx.html