【问题标题】:python "is" and "==" problems [duplicate]python“is”和“==”问题[重复]
【发布时间】:2018-09-06 06:04:17
【问题描述】:

我发现一个有趣的事情是使用“is”来判断两个变量是否相同。 这是我的代码和结果:

a = 256
b = 256
c = 257
d = 257
print(a is b)
print(c is d)

结果显示:

True
False

实际上,当数字大于 256 时,它会变为 'False'。

另一个例子:

a = 'a' * 20
b = 'a' * 20
c = 'a' * 21
d = 'a' * 21
print(a is b)
print(c is d)

结果:

True
False

同样,当"'a' * n"中的n大于20时,它变为'False'。

但是当我把它放到一个函数中时,这个数字有多大并不重要:

def is_test(a):
    x = a
    y = a
    print(x is y)

is_test(257)
is_test('a' * 21)

结果总是“真”

我在 Jupyter Notebook 上运行了代码。 任何人都可以向我解释这个吗?谢谢

【问题讨论】:

    标签: python python-3.x boolean jupyter-notebook equals


    【解决方案1】:

    is 检查它们是否是相同的对象(内存中的相同位置) == 检查它们是否具有相同的值,低值被预先存储,因此指向相同的内存空间。例如,每次需要它时写一个新的 1 和 0 只是因为它是为了新用途而写是愚蠢的,因为这两个数字经常被使用,所以它们只是指向一个包含 1 和 0 的预写数据表,其中具有较低的数字和其他常用值。

    【讨论】:

      【解决方案2】:

      首先,is 检查两个标识符是否是对同一对象的引用,而== 检查是否相等,并在适用时调用__eq__()

      在 CPython 中,从 -5 到 256 的整数在启动时被“缓存”,当您执行 a = 256 时,您只需返回对预定义 int 对象的引用。对于 257 及更高版本,它是在移动中创建的,因此您可能会获得两个值为 257 的 int 对象。

      对于长度不超过 20 且其值为有效标识符*的字符串,它们也以相同的方式缓存。这就是为什么当你定义这样的字符串两次时你会得到相同的对象引用。

      * 例如,字符串"a1b2c3" 的值是有效标识符,而">:})_!#*^" 不是。

      Source.

      【讨论】:

        【解决方案3】:
        a = 256
        b = 256
        c = a
        
        if (a == b):
            print("True")
        else:
            print("False")
        
        if (a is b):
            print("True")
        else:
            print("False")
        
        if (a is c):
            print("True")
        else:    
            print("False")
        

        输出:

        True
        False
        True
        

        说明

        1. True:第一个if condition 的输出是True,因为ab 都有 相同的值。

        2. False:第二个if condition 显示False,因为ab 位于 不同的内存位置。因此,它们指的是不同的对象。 我们可以用python中的id()函数来检查它,它返回identity 一个对象。

        3. True:第三个if condition 的输出是True,因为ac 指向同一个对象。

        【讨论】:

          【解决方案4】:

          您可以在这里参考Plain Integer Objects

          “当前的实现为 -5 到 256 之间的所有整数保留一个整数对象数组,当您在该范围内创建一个 int 时,您实际上只是取回了对现有对象的引用。所以应该可以更改值为 1。我怀疑 Python 在这种情况下的行为是未定义的。:-)"

          这就是为什么你会在 -5 ~ 256 的数字上得到相同的 id()。 至于其他数字,则以不同的方式引用。

          is 是识别是否引用同一个对象的方法,但 == 检查值是否相等。

          【讨论】:

            猜你喜欢
            • 2019-07-30
            • 1970-01-01
            • 2011-11-05
            • 2020-06-21
            • 2013-02-02
            • 2010-11-08
            • 1970-01-01
            • 2019-04-15
            • 2021-11-26
            相关资源
            最近更新 更多