我将用一个例子来解释:
list_1 = [1, 2, 3]
list_2 = list_3 = list_1 # reference copy
print(magic_method(list_1))
# Should print ['list_1', 'list_2', 'list_3']
set_1 = {'a', 'b'}
print(magic_method(set_1))
# Should print ['set_1']
要求:返回指向同一引用的所有变量的名称。用python完全可以吗?
我正在思考迭代globals()
和locals()
并等同id
的问题。还有什么更好的吗?
答案 0 :(得分:3)
对于全局变量,您可以这样做:
def magic_method(obj):
return [name for name, val in globals().items() if val is obj]
如果您也想要本地名称,可以使用inspect
模块:
def magic_method(obj):
import inspect
frame = inspect.currentframe()
try:
names = [name for name, val in frame.f_back.f_locals.items() if val is obj]
names += [name for name, val in frame.f_back.f_globals.items()
if val is obj and name not in names]
return names
finally:
del frame
然后:
list_1 = [1, 2, 3]
list_2 = list_1
def my_fun():
list_3 = list_1
list_2 = list_1
print(magic_method(list_1))
my_fun()
>>> ['list_3', 'list_1', 'list_2']
答案 1 :(得分:-2)
这有效:
def magic_method(var):
names = filter(lambda x: globals()[x] is var, globals().keys())
return names
is
执行参考比较。如果您使用的是Python3,请将list(...)
添加到结果表达式中。