列表中对象的名称?

时间:2016-10-05 15:00:22

标签: python list introspection

我试图迭代地将字典写入文件,但是在为每个字典创建唯一文件名时遇到问题。

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

4 个答案:

答案 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将引用每个对象。因此,返回名称abcobj,具体取决于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而不是==进行检查)无论你是否得到bobj,它都是随机的。

答案 3 :(得分:0)

所以你想找到globals()中可用的任何对象的名称?

for循环内,globals() dict正在变异,在其名称空间中添加obj。因此,在第二次传递中,您有两个对同一对象的引用(最初仅由名称' a'引用)。

我想,使用globals()的危险。