我想知道如何找到字典元素的变量名称:
例如:
>>>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'
谢谢大家。我现在明白我误解了很多基础知识(全脑屁)。将返回并修复设计。谢谢大家!。
答案 0 :(得分:9)
变量名只是一个名称 - 就程序而言,它没有任何实际意义,除非为程序员带来方便(这在Python中并不完全正确,但请耐心等待)。就Python解释器而言,名称dict1
只是程序员告诉Python查看内存地址0x1234
的方式。
此外,将内存地址(0x1234
)转换回变量名称(dict1
)的想法没有意义,特别是考虑到多个变量名称可以引用它对象:
dict1 = {...}
dictCopy = dict1
现在dictCopy
和dict1
一样是字典的名称 - 它们都引用相同的东西。如果您要查找的函数存在,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']