检索有关变量本身的信息?

时间:2017-08-08 10:19:59

标签: python

在Python中,一切都是对象。变量的本质是什么?在示例中探索它:

>>> foo = 1
>>> dir(foo)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', ...]
>>> dir(1)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', ...]

这里,对dir()的两次调用都列出了值(1的int对象)属性和方法。

>>> id(foo)
4376812816
>>> id(1)
4376812816

id()的调用显示两种情况下的对象都是相同的。

似乎没有办法获取有关变量本身的信息,而不是它引用的对象。 Python中有什么东西可以获取有关变量foo而不是它引用的对象的信息吗?

3 个答案:

答案 0 :(得分:3)

Python的变量基本上只是对象的名称。这些名称只是对象的标签,因此名称的唯一“属性”是它引用的对象,这正是使用名称所获得的。

话虽如此,名字属于某种东西:范围。名称在其定义的范围内有效,因此如果您可以访问该范围,则可以查看名称。您可以使用locals()访问当前的本地范围:

>>> foo = 1
>>> locals()
{'foo': 1, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__name__': '__main__', '__doc__': None, '__builtins__': <module 'builtins' (built-in)>, '__package__': None, '__spec__': None}

如您所见,该范围内有名称foo,其中包含值。但那就是真的。除了名称,它们引用的对象以及它们存在的范围之外,Python变量还没有任何其他属性。而且它们不是Python对象意义上的“对象”,因此它们是简化语句“一切都是对象”的例外。

有关名称的更多信息,请参阅“Facts and myths about Python names and values” by Ned Batchelder

答案 1 :(得分:1)

  

id显示了值的id并且没有告诉变量本身?使用哪个函数可以获得它的属性?

对象ID 不透明:没有(记录的,可靠的)方式从id到对象的属性。 id()的主要用例是检查两个名称是否引用同一个对象。

id(foo)恰好与id(1)相同的事实是implementation detail。它一般不成立:

>>> foo = 1234
>>> id(foo)
140491179040280
>>> id(1234)
140491179040808

(请注意两个数字是如何不同的。)

答案 2 :(得分:1)

我将用2个帖子回答你:是的,在python中,一切都是object

id就像C中的内存地址一样。如果你只想在对象中声明你的属性,对我来说,最好的选择就是使用集合:

class A():
    a = 2 

set(dir(A())) - set(dir(object))
#set(['a', '__module__'])
相关问题