从vars()和dict = {}创建的词典有什么区别?

时间:2017-05-18 18:27:32

标签: python variables dictionary

在阅读了关于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

3 个答案:

答案 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使您可以访问当前运行范围内的名称声明。