为什么'dir(1)是dir(True)'返回False

时间:2016-05-22 12:54:46

标签: python

来自this quieston的回答

  如果两个变量指向同一个对象,

将返回True,如果变量引用的对象相等,则返回=。

dir(1)dir(True)是否指向同一个对象?它们都打印出相同方法的列表。我在这里错过了关于 object 的内容吗?

>>> dir(1) == dir(True)
True
>>> dir(1) is dir(True)
False
>>> 

3 个答案:

答案 0 :(得分:4)

首先,True不是1

>>> True is not 1
True

其次,正如documentation所说

  

dir([object])

     

[...]使用参数,尝试返回该对象的有效属性列表。

     

如果对象具有名为__dir__()的方法,则将调用此方法,并且必须返回属性列表。这允许实现自定义__getattr__()__getattribute__()功能的对象自定义dir()报告其属性的方式。

     

如果对象未提供__dir__(),则该函数会尽力从对象的__dict__属性(如果已定义)及其类型对象中收集信息。生成的列表不一定完整,并且当对象具有自定义__getattr__()时可能不准确。

     

结果列表按字母顺序排序。 [...]

现在,intbool都有从__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将序列作为参数,并返回新的列表,其元素与原始序列相同;然后,这个新创建的列表为sortedreturned

>>> a = 1
>>> dir(a) is dir(a)
False

第三,Truebool类型的实例,它是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 Truedir(1) is dir(True)以及dir(1) == dir(True)之间感到困惑。