您可以验证彼此用= =操作符引用和对象的Java和加深你的理解。最初的问题:为什么Python运行直接或在命令行上运行相同的声明,但结果是不同的吗?是他们的缓存机制不同?事实上,高票答案已经详细说。我只是添加一个点。是操作符是一个内置的Python语言的运营商。它的功能是比较两个变量是否指向同一个对象。与= =类的区别():def __init__(自我,v): = vdef __eq__(自我,t):返回= = = b(3) =(3)打印一个= = bprint A是b的结果是真的,假的。因为我们有__eq__方法进行重写,这样比较a和b时,只能相比他们的价值。只要它们的值是相等的,那么a和b是相等的。
相同的对象?的使用是非常简单的,但当它真正使用,困难在于判断哪些对象是一样的。看看下面的测试,不看结果,多少你能获得正确的答案呢?10 = 10 b =打印一个英航= b =打印是ba = 10 def f():返回10 printf()是aa = 1000 def f():返回1000 printf()是aa = f (): def returnprint f()是一个嗯。结果是真的,真的,真的,假的,假的。你做对了吗?这个结果涉及到两个问题:第一个是小整数的缓存,第二个是组织的CodeObject pyc文件。Python缓存小整数从-127年到128年。这是Java的整数类一样。因此,对于整数-127年和128年之间,只有一个虚拟机实例在整个Python。
探讨这个问题,我们必须从字节码的角度分析它。让我们先编译这个文件:python - m compileall得到这样的输出:6400005 a00006400005a01006500006501006b080047486400005a00006401008400005a02006502008300006500006b08004748640200531 LOAD_CONST 0 () 3 STORE_NAME 0 (a) 2 6 LOAD_CONST 0 () 9 STORE_NAME 1 (b) 3 12 LOAD_NAME 0 15 LOAD_NAME 1 (a) (b) 18 COMPARE_OP 8(是)21 PRINT_ITEM22 PRINT_NEWLINE5 23 LOAD_CONST 0 () 26 STORE_NAME 0 (a) 32 MAKE_FUNCTION 035 STORE_NAME 2 (f) 8 38 LOAD_NAME 2 (f) 41 CALL_FUNCTION 044 LOAD_NAME 0 (a) 47 COMPARE_OP 8(是)50 PRINT_ITEM51 PRINT_NEWLINE52 LOAD_CONST 2(没有)55 RETURN_VALUE7 0 LOAD_CONST 1 () 3 RETURN_VALUENoneNone