我试图迭代地将字典写入文件,但是在为每个字典创建唯一文件名时遇到问题。
def variable_to_value(value):
for n, v in globals().items():
if v == value:
return n
else:
return None
a = {'a': [1,2,3]}
b = {'b': [4,5,6]}
c = {'c': [7,8,9]}
for obj in [a, b, c]:
name = variable_to_value(obj)
print(name)
打印:
a
obj
obj
如何访问原始对象本身的名称而不是obj
?
答案 0 :(得分:2)
问题在于obj
,您的迭代变量也在globals
中。无论您获得a
还是obj
,都只是运气好。您通常无法解决问题,因为对象可以在全局变量中具有任意数量的赋值。您可以更新代码以排除已知引用,但这非常脆弱。
例如
a = {'a': [1,2,3]}
b = {'b': [4,5,6]}
c = {'c': [7,8,9]}
print("'obj' is also in globals")
def variable_to_value(value):
return [n for n,v in globals().items() if v == value]
for obj in [a, b, c]:
name = variable_to_value(obj)
print(name)
print("you can update your code to exclude it")
def variable_to_value(value, exclude=None):
return [n for n,v in globals().items() if v == value and n != exclude]
for obj in [a, b, c]:
name = variable_to_value(obj, 'obj')
print(name)
print("but you'll still see other assignments")
foo = a
bar = b
bax = c
for obj in [a, b, c]:
name = variable_to_value(obj, 'obj')
print(name)
运行时
'obj' is also in globals
['a', 'obj']
['b', 'obj']
['c', 'obj']
you can update your code to exclude it
['a']
['b']
['c']
but you'll still see other assignments
['a', 'foo']
['b', 'bar']
['c', 'bax']
答案 1 :(得分:1)
该函数返回它找到的引用globals()
中对象的名字。但是,在每次迭代时,名称obj
将引用每个对象。因此,返回名称a
,b
或c
或obj
,具体取决于globals()
中首先达到的名称。
您可以通过从函数中的搜索中排除该名称来避免返回obj
- 一种hackish :
def variable_to_value(value):
for n, v in globals().items():
if v == value and n != 'obj':
return n
else:
return None
答案 2 :(得分:0)
Python实际上并不像这样工作。
Python中的对象没有固有名称。它是属于对象的名称,而不是相反:对象可以有许多名称(或根本没有名称)。
您正在打印两份“obj”,因为当您拨打variable_to_value
时,名称b
和名称obj
都指的是同一个对象! (字典{'b': [4,5,6]}
)因此当您搜索全局命名空间中任何等于obj
的值时(请注意,您应该使用is
而不是==
进行检查)无论你是否得到b
或obj
,它都是随机的。
答案 3 :(得分:0)
所以你想找到globals()
中可用的任何对象的名称?
在for
循环内,globals() dict
正在变异,在其名称空间中添加obj
。因此,在第二次传递中,您有两个对同一对象的引用(最初仅由名称' a'引用)。
我想,使用globals()
的危险。