来自this quieston的回答
如果两个变量指向同一个对象,将返回True,如果变量引用的对象相等,则返回=。
dir(1)
和dir(True)
是否指向同一个对象?它们都打印出相同方法的列表。我在这里错过了关于 object 的内容吗?
>>> dir(1) == dir(True)
True
>>> dir(1) is dir(True)
False
>>>
答案 0 :(得分:4)
首先,True
不是1
:
>>> True is not 1
True
其次,正如documentation所说
dir([object])
[...]使用参数,尝试返回该对象的有效属性列表。
如果对象具有名为
__dir__()
的方法,则将调用此方法,并且必须返回属性列表。这允许实现自定义__getattr__()
或__getattribute__()
功能的对象自定义dir()
报告其属性的方式。如果对象未提供
__dir__()
,则该函数会尽力从对象的__dict__
属性(如果已定义)及其类型对象中收集信息。生成的列表不一定完整,并且当对象具有自定义__getattr__()
时可能不准确。结果列表按字母顺序排序。 [...]
现在,int
和bool
都有从__dir__
填充的object.__dir__
广告位:
>>> int.__dir__
<method '__dir__' of 'object' objects>
>>> bool.__dir__
<method '__dir__' of 'object' objects>
object.__dir__
的文档添加了以下一点信息:
<强>
object.__dir__(self)
强>在对象上调用
dir()
时调用。必须返回一个序列。dir()
将返回的序列转换为列表并对其进行排序。
正如文档所述,dir
为每次调用构建一个 new 列表,然后对进行排序。 (我们还可以查看_dir_object
的代码,该代码在__dir__
的返回值上调用PySequence_List
; PySequence_List
将序列作为参数,并返回新的列表,其元素与原始序列相同;然后,这个新创建的列表为sorted和returned)
>>> a = 1
>>> dir(a) is dir(a)
False
第三,True
是bool
类型的实例,它是int
的子类。
>>> isinstance(True, bool)
True
>>> isinstance(1, int)
True
>>> issubclass(bool, int)
True
>>> isinstance(True, int)
True
此外,bool
不会添加int
中尚未存在的任何方法。并且因为结果列表按字母顺序排序,
>>> dir(1) == dir(True)
True
答案 1 :(得分:2)
每次执行dir
时,都会创建新对象。
>>> dir(True) is dir(True)
False
答案 2 :(得分:0)
dir
为每次返回的int
创建一个新对象。
基本上你在1 is True
和dir(1) is dir(True)
以及dir(1) == dir(True)
之间感到困惑。