在python中进行减法操作时得到奇怪的结果

在python中进行减法操作时得到奇怪的结果,python,Python,可能重复: 有谁能解释我,我是如何在一种情况下变假,在另一种情况下变真的,因为同样的操纵 更奇怪的是 >>> (0 - 10) is (0 - 10) False 不要使用is进行相等性测试-它是identity操作符,两个相等的对象不一定完全相同(即位于计算机内存中的同一地址下)。一些小整数可以被缓存和重用,但不是全部,这就是为什么您在这里看到不同的结果 此外,此行为取决于实现,因此您不能总是依赖于此。不要使用is进行相等性测试-它是标识运算符,两个相等的对象不一定相同

可能重复:

有谁能解释我,我是如何在一种情况下变假,在另一种情况下变真的,因为同样的操纵

更奇怪的是

>>> (0 - 10) is (0 - 10)
False

不要使用
is
进行相等性测试-它是identity操作符,两个相等的对象不一定完全相同(即位于计算机内存中的同一地址下)。一些小整数可以被缓存和重用,但不是全部,这就是为什么您在这里看到不同的结果


此外,此行为取决于实现,因此您不能总是依赖于此。

不要使用
is
进行相等性测试-它是标识运算符,两个相等的对象不一定相同(即位于计算机内存中的同一地址下)。一些小整数可以被缓存和重用,但不是全部,这就是为什么您在这里看到不同的结果

此外,此行为取决于实现,因此您不能总是依赖于这种情况。

来自:

当前的实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用。因此,应该可以更改1的值。我怀疑Python在本例中的行为是未定义的。:-)

根据我的经验:在我的Python2.7中,
(0+x)是x
返回
True
,表示
x
介于
-5
+256
之间,其他地方的
为False

当前的实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用。因此,应该可以更改1的值。我怀疑Python在本例中的行为是未定义的。:-)


根据我的经验:在我的Python2.7中,
(0+x)是x
返回
True
x
介于
-5
+256
之间,其他地方的
为False

您正在创建
int
的实例,并希望它们都是同一个对象。对于大多数其他对象,这通常根本不起作用,因此您可能会惊讶地发现
True


原因是Python在启动时创建了一组常用的整数对象,可以在需要时重用它们。这是可行的,因为
int
是不可变的,但只是一种优化。

您正在创建
int
的实例,并希望它们都是相同的对象。对于大多数其他对象,这通常根本不起作用,因此您可能会惊讶地发现
True


原因是Python在启动时创建了一组常用的整数对象,可以在需要时重用它们。这算是正常的,因为
int
是不可变的,但只是一种优化。

is操作符将确定两个对象是否具有相同的标识(在低级术语中,它们的表示是否在内存中的相同地址)

在Python中,数字和其他对象一样都是对象,因此
是否有效取决于您如何创建它们

a = 0
a is a
True
代码在一种情况下工作而在另一种情况下不工作的原因是Python实习小整数;也就是说,它不会为
-5
创建一个新的数字对象,而是保留一个小整数缓存,并为您提供适当的数字对象。另一方面,在您的情况下,
-10
不是实习生,因此Python每次都必须创建一个新的number对象

插入的其他对象包括短字符串(包括单字符串)和
True
和`False


你不应该依赖实习;您应该使用
=
操作符来代替
is

is
操作符将确定两个对象是否具有相同的标识(在低级术语中,它们的表示是否位于内存中的相同地址)

在Python中,数字和其他对象一样都是对象,因此
是否有效取决于您如何创建它们

a = 0
a is a
True
代码在一种情况下工作而在另一种情况下不工作的原因是Python实习小整数;也就是说,它不会为
-5
创建一个新的数字对象,而是保留一个小整数缓存,并为您提供适当的数字对象。另一方面,在您的情况下,
-10
不是实习生,因此Python每次都必须创建一个新的number对象

插入的其他对象包括短字符串(包括单字符串)和
True
和`False


你不应该依赖实习;您应该使用
=
操作符,而不是
is

可能有一些实现优化,可以重用相同的数字对象

我想说这就是为什么有时候你会得到
正确的

$ python3
Python 3.2.3 (default, May  3 2012, 15:51:42)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> id(3)
9357472
>>> id(3)
9357472
我认为您正在寻找与
=
相等的检查:

>>> 3 is 3    # Result may depend on implementation details
True
>>> 3 == 3    # Always True
True

可能有一些实现优化可能会重用相同的数字对象

我想说这就是为什么有时候你会得到
正确的

$ python3
Python 3.2.3 (default, May  3 2012, 15:51:42)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> id(3)
9357472
>>> id(3)
9357472
我认为您正在寻找与
=
相等的检查:

>>> 3 is 3    # Result may depend on implementation details
True
>>> 3 == 3    # Always True
True
也见也见