在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
而不是它引用的对象的信息吗?
答案 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)