Get a list of all possible variable names corresponding to an object in python
假设我定义了这些变量
1 2 3 4 5
| a=1
b="2"
c=2
d=2
e="2" |
我需要一种方法来获取所有可以与我指定的对象配对的变量名。例如,如果我指定"2",它应该返回["b","e"],因为这是两个值为"2"的变量。如果我指定整数2,它应该给我["c","d"]。有办法吗?我也在找一个Python式的答案。
- 你为什么不能用听写?(myobjects['a'] = 1和myobjects['b'] ="2"等)这将更容易使用。
- 没有pythonic方法可以做到这一点,您必须检查所有可能的名称:所有可能的名称空间中的对象对,以得到一个一般的答案。如果您可以检索到一个名称空间,例如globals,那么您可以检查该名称空间。一般来说,除非您正在构建调试器或soemting,否则不应该依赖于这种类型的东西。
- @你标记的副本和我问的问题几乎没有关系。
- @当然是QWERTY,它是关于从对象中检索变量名作为字符串。
- @这不是复制品,因为那个问题没有我的答案。
- 是的,是的。几个答案没有回答你的问题呢?
- 我不想只给出一个变量并把变量名作为字符串,我想得到所有可能的变量名,这些变量名可以是我以列表形式指定的对象对。@朱恩帕·阿里维拉加
- 这正是答案中提到的内容。在我的评论中。
- @Juanpa.arrivilaga我必须承认答案与我自己的答案相差甚远,我理解Op的评论,但是嘿1)Op的问题得到了回答2)我不会出于对你的尊重而重新开放3)5票的上涨已经很好了(对于非重复的:)。上次有个回答者重开了一个问题,我闭嘴了,复制品更明目张胆,他被扇了一巴掌!!
- @Jean-Fran&Oisfabre有各种各样的答案,包括按两个顺序搜索调用堆栈,最终到达locals和globals,您的答案只是专门查看locals或globals,但名称可以存在于其他块中。您的答案基本上是硬编码本地范围和全局范围,而忽略其他块,这对于操作试图完成的任何操作都是好的,尽管我怀疑从一开始这是一个xy问题。
- 我认为,大多数时候,当你想做这样的事情(这是可以质疑的,是的,因为你得到了所有的垃圾变量),你可能会关心你可以在当前范围内访问的变量。但是glibdud的第一条评论是:只需将要保存在dict中的变量存储起来,除非您要维护其他人的糟糕代码/调试它。
- 例如,一个有效的用法是:有人忘记了一个print(z),所以代码每秒显示"12.0"多次,但从哪里来的?在这种情况下,我承认扫描所有功能范围会更好。
对于全局变量,扫描globals()字典,并用您要查找的值提取变量:
1 2 3 4 5 6 7
| a=1
b="2"
c=2
d=2
e="2"
print([k for k,v in globals().items() if v=="2"]) |
结果:
使用locals()的当地人也是如此。要测试局部变量和全局变量,请同时链接dict项并使用set,因为值根据范围重复:
[cc lang="python"]k for k,v in itertools.chain(locals().items(),globals().items())if v=="2