0

我试图将用户的输入输入到变量中,但我希望它分配一个已经定义的不同变量,而不是字符串、浮点数或整数。伪ish示例:

xy = 23
a = raw_input("Enter a variable") xy
print (a)
23

是的,这可以通过 if 变量来控制,但对于许多变量,我相信这不是很实用?我打字没问题,只是想知道这不是不好的做法吗?

4

3 回答 3

3

您可以使用globals()获取包含全局命名空间或locals()本地命名空间中所有变量的字典:

>>> xy = 23
>>> a = globals()[raw_input("Enter a variable ")]
Enter a variable xy
>>> print (a)
23
>>> globals()
{'a': 23, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None
, 'xy': 23, '__name__': '__main__', '__doc__': None}

有关他们的更多信息。在顶层,两者都将返回相同的 dict,但在函数内部使用时可以看出区别:

>>> def foo(x):
...   print globals()
...   print locals()
...
>>> foo(10)
{'a': 23, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None
, 'xy': 23, '__name__': '__main__', 'foo': <function foo at 0x00BC5FB0>, '__doc_
_': None}
{'x': 10}

请注意,此技术不涉及eval任何方式,因此如果用户尝试输入恶意输入,它只会引发keyError. 但是,根据您计划对变量执行的操作,仍然可能存在一些安全风险(从这个意义上说,使用locals()更安全,因为您可以控制可以通过这种方式访问​​的精确变量集)。

于 2012-11-29T10:06:27.540 回答
1

你在寻找这样的东西吗?

xy = 23
a = eval(raw_input("Enter a variable"))
print (a)

在用户输入未知变量的情况下添加检查的任务留给读者......

还要注意这种方法的潜在安全问题。一种更安全的方法是通过定义应该使用的特定dicts来限制评估范围。eval阅读更多内容help(eval)

于 2012-11-29T10:06:26.210 回答
1

只需将您的 var 保存在字典中,它也可能是最安全的:

In [52]: d={'x':1,'y':2,'z':3}

In [53]: a=d.get(raw_input('enter var'),None)

例子:

In [57]: a=d.get(raw_input('enter var: '),None)

enter var: y

In [58]: print a
2

In [59]: a=d.get(raw_input('enter var: '),None) # You can specify a default value

enter var: Foo

In [60]: print a
None
于 2012-11-29T10:08:05.780 回答