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

时间:2009-03-25 02:36:08

标签: python dictionary variables lookup

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

例如:

    >>>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很陌生:)

感谢任何帮助,谢谢!

相关


更新:这就是为什么我希望这个工作:

我正在尝试制作一个使用类似数据库的字典的应用程序。我希望这个伪代码的功能起作用:

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的“评论”字段:

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

而不是必须:

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

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

7 个答案:

答案 0 :(得分:9)

变量名只是一个名称 - 就程序而言,它没有任何实际意义,除非为程序员带来方便(这在Python中并不完全正确,但请耐心等待)。就Python解释器而言,名称dict1只是程序员告诉Python查看内存地址0x1234的方式。

此外,将内存地址(0x1234)转换回变量名称(dict1)的想法没有意义,特别是考虑到多个变量名称可以引用它对象:

dict1 = {...}
dictCopy = dict1

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

答案 1 :(得分:7)

添加zenazn所说的内容:

  

但是如何将该ID转换回变量名?

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

答案 2 :(得分:4)

琐碎的答案:而不是

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

使用:

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

但是使用字典来表示单个电影是非常不合适的。为什么不改用课程呢?

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'

答案 3 :(得分:1)

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

快速破解就是将变量名实际放入......

dict2['item_n'] = 'dict1'

或者可能使用元组..

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

有一个名为locals()的函数,它提供了一个本地变量名称的字典,也许你可以在重新考虑你的设计时考虑它。

在这里,看看locals()的工作原理:

>>> 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}

<强>更新

  

我希望能够通过以下方式更新FooBar1.avi的“评论”字段:

     

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

嗯,这很简单

dict_databse [identifier] [2] = the_new_comment

答案 4 :(得分:1)

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

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

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

dict_database = {}
dict_database["0001"] = dict_1
dict_database["0002"] = dict_2
dict_database["0003"] = dict_3
dict_database["000n"] = dict_n

编辑:这可能就是您的想法。

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

movie_n = {}
movie_n["movie_duration"] = 333
movie_n["movie_type"] = "Fantasy"
movie_n["comments"] = ""

然后movies["any_file.avi"]给你那个字典。要将电影添加到目录然后添加注释,请输入:

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

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

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

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

答案 5 :(得分:0)

  

我怎样才能告诉我   dict2 ['nth_dict_item']是或是   引用“dict1”?

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

答案 6 :(得分:0)

使用Guppy

from guppy import hpy
h=hpy()
h.iso(dict2['nth_dict_item']).sp

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