为什么以下在Python中出现意外行为?
>>> a = 256
>>> b = 256
>>> a is b
True # This is an expected result
>>> a = 257
>>> b = 257
>>> a is b
False # What happened here? Why is this False?
>>> 257 is 257
True # Yet the literal numbers compare properly
Run Code Online (Sandbox Code Playgroud)
我使用的是Python 2.5.2.尝试一些不同版本的Python,似乎Python 2.3.3显示了99到100之间的上述行为.
基于以上所述,我可以假设Python在内部实现,使得"小"整数以不同于大整数的方式存储,is运算符可以区分.为什么泄漏抽象?当我不知道它们是否是数字时,比较两个任意对象以查看它们是否相同的更好的方法是什么?
我对不可变类型是多么困惑.我知道该float对象被认为是不可变的,我的书中有这种类型的例子:
class RoundFloat(float):
def __new__(cls, val):
return float.__new__(cls, round(val, 2))
Run Code Online (Sandbox Code Playgroud)
这是因为类结构/层次结构被认为是不可变的吗?意思float是在类的顶部并且是它自己的方法调用.类似于这种类型的例子(即使我的书说dict是可变的):
class SortedKeyDict(dict):
def __new__(cls, val):
return dict.__new__(cls, val.clear())
Run Code Online (Sandbox Code Playgroud)
虽然可变的东西在类中有方法,但是这种类型的例子:
class SortedKeyDict_a(dict):
def example(self):
return self.keys()
Run Code Online (Sandbox Code Playgroud)
另外,对于最后一个class(SortedKeyDict_a),如果我将这种类型的集合传递给它:
d = (('zheng-cai', 67), ('hui-jun', 68),('xin-yi', 2))
Run Code Online (Sandbox Code Playgroud)
在不调用example方法的情况下,它返回一个字典.SortedKeyDictwith 将其__new__标记为错误.我尝试将整数传递给RoundFloat类,__new__并且它没有标记错误.