Python:如何提取字典条目的变量名?

Python: How to extract variable name of a dictionary entry?

我想知道如何找到字典元素的变量名:

例如:

1
2
3
4
5
6
7
8
9
    >>>dict1={}
    >>>dict2={}

    >>>dict1['0001']='0002'
    >>>dict2['nth_dict_item']=dict1
    >>>print dict2
    {'nth_dict_item': {'0001': '0002'}}
    >>>print dict2['nth_dict_item']
    {'001': '002'}

我该怎么做才能让它告诉我dict2[‘nth-dict-item’]是或正在引用"dict1"?我想要它引用的数据结构的名称,而不是数据本身。

如果我将id(dict1)的输出与id(dict2['nth_dict_item'])进行比较,就会发现它们是相同的。

但我如何才能将该ID转换回变量名呢?有没有更直接/更清晰的方法来获取我想知道的信息?

我确信我只是忽略了一个可以让我的生活变得简单的函数,但是我对python还很陌生:)

感谢您的帮助,谢谢!

相关的

  • python,我可以打印原始变量名吗?
  • 如何在python中打印变量名?

更新:这就是为什么我想要这个工作:

我正在尝试制作一个像数据库一样使用字典的应用程序。我希望此psuedocode的功能能够工作:

1
2
3
4
5
6
7
8
9
10
11
dict_1={}
dict_2={}
dict_3={}

dict_1["FooBar1.avi"]=[movie_duration,movie_type,comments]
dict_2["FooBar2.avi"]=[movie_duration,movie_type,comments]
dict_3["FooBar3.avi"]=[movie_duration,movie_type,comments]

dict_database[SomeUniqueIdentifier1]=dict_1
dict_database[SomeUniqueIdentifier2]=dict_2
dict_database[SomeUniqueIdentifier3]=dict_3

someUniqueIdentifier是一个唯一的值,我使用它作为数据库键/unqiueid来查找条目。

我想通过以下方式更新foobar1.avi的"注释"字段:

1
2
WhichDict= dict_database[SomeUniqueIdentifier1]
WhichDict[WhichDict.keys()[0]][2]='newcomment'

而不是必须这样做:

1
dict_database['SomeUniqueIdentifier1'][dict_database['SomeUniqueIdentifier1'].keys()[0]][2]='newcomment'

谢谢大家。我现在明白了我误解了很多基本知识(完全是脑残)。将返回并修复设计。谢谢大家!.


变量名只是一个名称——就程序而言,它没有真正的意义,只是为了方便程序员(这在Python中并不完全正确,但请放心)。至于python解释器,名称dict1只是程序员告诉python查看内存地址0x1234的方法。

此外,将内存地址(0x1234变回变量名(dict1的想法是没有意义的,特别是考虑到不止一个变量名可以引用同一个对象:

1
2
dict1 = {...}
dictCopy = dict1

现在,dictCopydict1一样,是字典的名称——它们都引用相同的东西。如果您要查找的函数已经存在,那么python应该选择哪个名称?


补充Zenazn所说的:

But how can I turn that id back into a variable name?

简短的回答是你不想真的想要。如果你认为你需要的话,你的程序设计有点问题。如果你更具体地告诉我们你想解决什么问题,我们可以帮助你找到更好的方法来解决它。


简单的答案:而不是

1
WhichDict[WhichDict.keys()[0]][2]='newcomment'

用途:

1
WhichDict.values()[0][2]='newcomment'

但是用字典来代表一部电影是非常不合适的。为什么不用一个类来代替呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
class Movie(object):
    def __init__(self, filename, movie_duration, movie_type, comments):
        self.filename = filename
        self.movie_duration = movie_duration
        self.movie_type = movie_type
        self.comments = comments

database = dict()
database['unique_id_1'] = Movie("FooBar1.avi", duration, type, comments)
# ...

some_movie = database[some_id]
some_movie.comment = 'newcomment'


现在,对于每部电影,你都在做:

1
2
dict_n = {}
dict_n["000n"] = [movie_duration,movie_type,comments]

每个dict只有一个条目。然后您将多个电影dict存储在一个中央目录中:

1
2
3
4
5
dict_database = {}
dict_database["0001"] = dict_1
dict_database["0002"] = dict_2
dict_database["0003"] = dict_3
dict_database["000n"] = dict_n

编辑:这可能是你想的。

对于每部电影,都有一个从属性名到值的dict。

1
2
3
4
movie_n = {}
movie_n["movie_duration"] = 333
movie_n["movie_type"] ="Fantasy"
movie_n["comments"] =""

然后,movies["any_file.avi"]给你口述。要将电影添加到目录,然后添加评论,你可以输入:

1
2
movies["any_file.avi"] = movie_n
movies["any_file.avi"]["comments"] ="new comment"

如果您必须在该电影的编号和文件名之间进行选择,我将使用文件名,因为当您实际尝试访问电影时,它更为相关。另外,如果必要的话,你可以通过movies.keys()或类似的方式来列举你的电影(尽管顺序不对)。如果要同时使用数字和文件名,请将文件名添加为每部电影的另一个键。

1
movie_n["filename"] ="any_file.avi"

1
movies["000n"]["filename"] ="any_file.avi"


你需要重新考虑你的设计。

一个快速的方法就是把变量名放在…

1
dict2['item_n'] = 'dict1'

或者用一个元组……

1
dict2['item_n'] = ('dict1', dict1)

有一个叫做locals()的函数,它给出了一个局部变量名的字典,也许你可以在重新考虑你的设计时考虑它。

这里,请看一下locals()的工作原理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> x = 10
>>> y = 20
>>> c ="kmf"
>>> olk = 12
>>> km = (1,6,"r",x)
>>> from pprint import pprint
>>> pprint( locals() )
{'__builtins__': <module '__builtin__' (built-in)>,
 '__doc__': None,
 '__name__': '__main__',
 'c': 'kmf',
 'km': (1, 6, 'r', 10),
 'olk': 12,
 'pprint': <function pprint at 0x016A0EB0>,
 'x': 10,
 'y': 20}

更新

I want to be able to update the"comments" field of FooBar1.avi by:

WhichDict= dict_database[SomeUniqueIdentifier1]
WhichDict[WhichDict.keys()[0]][2]='newcomment'

嗯,这是微不足道的

dict_databse[identifier][2]=新注释


使用Guppy。

1
2
3
4
5
from guppy import hpy
h=hpy()
h.iso(dict2['nth_dict_item']).sp

0: h.Root.i0_modules['__main__'].__dict__['dict1']


How can I go about making it tell me
that dict2['nth_dict_item'] is or is
referencing"dict1" ?

1
2
>>> print dict2['nth_dict_item'] is dict1
True