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解释器,名称
此外,将内存地址(
1 2 | dict1 = {...} dictCopy = dict1 |
现在,
补充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"] ="" |
。
然后,
1 2 | movies["any_file.avi"] = movie_n movies["any_file.avi"]["comments"] ="new comment" |
号
如果您必须在该电影的编号和文件名之间进行选择,我将使用文件名,因为当您实际尝试访问电影时,它更为相关。另外,如果必要的话,你可以通过
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) |
。
有一个叫做
这里,请看一下
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 |
号