出于某种原因,我需要明确地使用 locals()
来为某些变量赋值;但我想稍后直接引用这些变量。下面的例子解释了我在想什么:
#!/usr/bin/env python
def hello():
local = locals()
c = 1
for i in ['x', 'y', 'z']:
local[i] = c
c += 1
print(x)
hello()
但是它不正确,错误消息:
Traceback (most recent call last):
File "./ttt.py", line 11, in <module>
hello()
File "./ttt.py", line 9, in hello
print(x)
NameError: global name 'x' is not defined
似乎Python看起来像全球&#39; x&#39;而不是本地一个。当然我可以在第9行使用print(local['x'])
,但是否有其他方式?
我真正需要的是&#34;自动&#34;创建与字符串列表相关的几个变量:每个变量&#39; 名称和值是列表中一个字符串的转换。 例如,
# given
list_of_string = ['clang', 'scan-build']
# I hope to create two variables:
clang = '/usr/bin/clang'
scan_build = '/usr/local/bin/scan-build'
此处变量的名称( clang , scan_build )是list_of_string
中的字符串,除了&#39; - &#39;被替换为&#39; _&#39;,值是字符串的真正位置(由某个函数生成的作为unix which
)。
答案 0 :(得分:0)
来自locals()
注意:
不应修改此词典的内容;更改可能不会影响解释器使用的本地和自由变量的值。
答案 1 :(得分:0)
从技术上讲,你可以使用eval
,但我会找到另一种方法来做你想做的事情:
print(eval("x"))
同样local = locals()
在本地人中存储对自身的引用。
如果要动态存储变量,只需使用普通字典并按键访问:
def hello():
local = {}
c = 1
for i in ['x', 'y', 'z']:
local[i] = c
c += 1
print(local["x"])
print(local["y"])
print(local["z"])
hello()
1
2
3
如果你需要在其他函数中共享变量,只需返回dict add pass将返回值传递给其他函数。
答案 2 :(得分:0)
您无法动态分配本地变量。由于您没有编写实际用例,我只能给出一个常见用例:您有一些默认值的字典:
def hello(values):
x = values.get('x', 1)
y = values.get('y', 2)
z = values.get('z', 3)
print(x)
答案 3 :(得分:0)
不要惹恼locals
。使用字典:
import subprocess
list_of_strings = ['clang', 'no-name', 'xml2-config']
d={}
for s in list_of_strings:
try:
rtr=subprocess.check_output(['which',s])
d[s.replace('-','_')]=rtr.rstrip()
except subprocess.CalledProcessError:
print '"{}" not found'.format(s)
print d
打印(在OS X上):
"no-name" not found
{'clang': '/usr/bin/clang', 'xml2_config': '/usr/bin/xml2-config'}