在阅读了关于vars()之后,我仍然对它实际做的事情感到有些困惑。在查看Python文档时,"如果对象具有__ dict __ attribute,则vars()函数返回给定对象的__ dict __属性。"那么,它返回一个字典对象?以下是我真正得到的问题:
1)vars()在下面的代码中实际做了什么?
dict = {}
dict['H'] = atom
vars()[dict['H']] = 20
2)为什么我创建的字典前面需要vars(),我可以把它留下来吗? (如果我把代码遗漏掉,我知道代码会失败,但是完成相同任务会有什么不同的方法吗?)
dict = {}
dict['H'] = atom
dict['H'] = 20
答案 0 :(得分:2)
vars()在下面的代码中实际做了什么?
它始终如一地执行:它将所有局部变量检索为字典。这是在没有参数的情况下调用vars
时的工作原理。
为什么在我创建的字典前面需要vars(),我可以把它留下来吗?
似乎有人在做当地范围的恶作剧。只是它被dict['H']
包裹,这只是一些变量(可能atom
是一个字符串)。换句话说,他试图通过动态名称检索变量。例如
>>> test = 15
>>> x = 'test'
>>> vars()[x]
15
这应该不惜一切代价避免。忘了你甚至知道vars()
的存在。当你不得不使用vars()
代替dict或其他一些" normal"时,我不知道一个案例。 (在这种情况下安全)结构。您正在查看的代码非常难以维护,容易出错并且存在严重的安全问题。
答案 1 :(得分:1)
1)
vars()
在以下代码中做什么
老实说,这很难说。 vars()
(不带参数)将本地名称空间作为字典返回。换句话说,它与locals()
做同样的事情。在您的代码中,然后在本地dict中查找名称(dict['H']
)并在其中设置项目。如果你在一个函数中,在locals()
返回的dict中设置一个项什么都不会...如果你在全局命名空间中,它会添加一个属性。
2)为什么在我创建的字典前面需要
vars()
,我可以把它留下来吗?
这可能不是必要的,你可能应将其排除在外。通常,全局命名空间上的动态设置属性是一个非常糟糕的主意。您通常应该传递一个您需要的数据字典。换句话说,你可以做:
v = 'foo'
globals()[v] = 'bar'
# ...
value = globals()[v] # 'bar'
但你不应该。只需传递字典就可以了:
v = 'foo'
dct = {v: 'bar'}
# ...
value = dct[v]
答案 2 :(得分:0)
首先,您不应该覆盖__builtin__
个函数。 dict
是用于创建字典对象的函数的保留名称。
其次,var
使您可以访问当前运行范围内的名称声明。