将两个变量与'is'运算符进行比较,这些运算符在Python中的一行中声明

时间:2015-08-28 04:02:34

标签: python python-2.7

根据Documentation

  

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

所以以下行为是正常的。

>>> a = 256
>>> b = 256
>>> a is b
True
>>> c = 257
>>> d = 257
>>> c is d
False

但是当我声明两个这样的变量时,我得到的是 True -

>>> e = 258; f=258;
>>> e is f
True

我检查过e和f引用的对象的身份 -

>>> id(e)
43054020
>>> id(f)
43054020

他们是一样的。

我的问题是当我们用分号分隔e和f时发生了什么?为什么它们引用同一个对象(尽管这些值超出了Python的整数对象数组的范围)?

如果你能解释它,就像你向初学者解释一样,那就更好了。

1 个答案:

答案 0 :(得分:5)

根据Python Data model的实施细节,这是一种意想不到的行为:

  

类型几乎影响对象行为的所有方面。即便是   对象身份的重要性在某种意义上受到影响:表示不可变   类型,计算新值的操作实际上可以返回a   引用具有相同类型和值的任何现有对象,而   对于可变对象,这是不允许的。例如,在a = 1之后; b = 1,a   和b可能会或可能不会引用值为1的同一对象,   取决于实施,但在c = []之后; d = [],c和d是   保证引用两个不同的,独特的,新创建的空   名单。 (注意,c = d = []将同一个对象分配给c和d。)