如何告诉 Python 使用局部名称而不是全局名称?
How to tell Python to use local name rather than global one?
出于某种原因,我需要明确地使用 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 看起来是 global 'x' 而不是 local 。我当然可以在第 9 行使用 print(local['x'])
,但是有 另一种 方式吗?
更新:
我真正需要的是 "automatically" 创建几个与 字符串列表相关的变量 :每个变量的 name 和 value 是列表中一个字符串的转换。
例如,
# given
list_of_string = ['clang', 'scan-build']
# I hope to create two variables:
clang = '/usr/bin/clang'
scan_build = '/usr/local/bin/scan-build'
这里是变量的name(clang,scan_build)是 list_of_string
中的字符串,除了 '-' 被替换为 '_',而 value 是字符串的实际位置(由某些函数生成,作为 unix which
).
来自关于 locals()
返回的字典的文档
Note:
The contents of this dictionary should not be modified; changes may not affect the values of local and free variables used by the interpreter.
技术上你可以使用 eval
但我会找到另一种方法来做你想做的事:
print(eval("x"))
同时 local = locals()
在 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
如果您需要在其他函数之间共享变量,只需 return dict add 将 returned 值传递给其他函数。
您不能动态分配局部变量。因为你没有写你的实际用例,我只能给出一个常见的用例:你有一些默认值的字典:
def hello(values):
x = values.get('x', 1)
y = values.get('y', 2)
z = values.get('z', 3)
print(x)
不要惹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'}
出于某种原因,我需要明确地使用 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 看起来是 global 'x' 而不是 local 。我当然可以在第 9 行使用 print(local['x'])
,但是有 另一种 方式吗?
更新:
我真正需要的是 "automatically" 创建几个与 字符串列表相关的变量 :每个变量的 name 和 value 是列表中一个字符串的转换。 例如,
# given
list_of_string = ['clang', 'scan-build']
# I hope to create two variables:
clang = '/usr/bin/clang'
scan_build = '/usr/local/bin/scan-build'
这里是变量的name(clang,scan_build)是 list_of_string
中的字符串,除了 '-' 被替换为 '_',而 value 是字符串的实际位置(由某些函数生成,作为 unix which
).
来自关于 locals()
Note:
The contents of this dictionary should not be modified; changes may not affect the values of local and free variables used by the interpreter.
技术上你可以使用 eval
但我会找到另一种方法来做你想做的事:
print(eval("x"))
同时 local = locals()
在 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
如果您需要在其他函数之间共享变量,只需 return dict add 将 returned 值传递给其他函数。
您不能动态分配局部变量。因为你没有写你的实际用例,我只能给出一个常见的用例:你有一些默认值的字典:
def hello(values):
x = values.get('x', 1)
y = values.get('y', 2)
z = values.get('z', 3)
print(x)
不要惹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'}