当前实现为
-5
和256
之间的所有整数保留一个整数对象数组,当您在该范围内创建一个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的整数对象数组的范围)?
如果你能解释它,就像你向初学者解释一样,那就更好了。
答案 0 :(得分:5)
根据Python Data model的实施细节,这不是一种意想不到的行为:
类型几乎影响对象行为的所有方面。即便是 对象身份的重要性在某种意义上受到影响:表示不可变 类型,计算新值的操作实际上可以返回a 引用具有相同类型和值的任何现有对象,而 对于可变对象,这是不允许的。例如,在a = 1之后; b = 1,a 和b可能会或可能不会引用值为1的同一对象, 取决于实施,但在c = []之后; d = [],c和d是 保证引用两个不同的,独特的,新创建的空 名单。 (注意,c = d = []将同一个对象分配给c和d。)