2

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

例如:

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

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

4

7 回答 7

9

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

此外,将内存地址 ( 0x1234) 转换回变量名 ( dict1) 的想法本身是没有意义的,尤其是考虑到多个变量名可以引用同一个对象:

dict1 = {...}
dictCopy = dict1

现在dictCopy和字典的名称一样多dict1——它们都引用了同一个东西。如果您要查找的函数存在,Python 应该选择哪个名称?

于 2009-03-25T02:47:39.550 回答
7

添加zenazn所说的:

但是我怎样才能把那个 id 变成一个变量名呢?

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

于 2009-03-25T03:11:28.447 回答
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'
于 2009-03-25T04:49:49.427 回答
1

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

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

每个字典只有一个条目。然后你将多个电影字典存储在一个中心:

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"
于 2009-03-25T04:56:36.650 回答
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[标识符][2] = the_new_comment

于 2009-03-25T04:31:30.610 回答
0

使用孔雀鱼

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

0: h.Root.i0_modules['__main__'].__dict__['dict1']
于 2009-03-25T11:12:35.247 回答
0

我怎样才能让它告诉我 dict2['nth_dict_item'] 是或正在引用 "dict1" ?

>>> print dict2['nth_dict_item'] is dict1
True
于 2009-03-25T04:21:11.913 回答