Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何告诉Python使用本地名称而不是全局名称?_Python_Scope - Fatal编程技术网

如何告诉Python使用本地名称而不是全局名称?

如何告诉Python使用本地名称而不是全局名称?,python,scope,Python,Scope,出于某种原因,我需要显式地使用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

出于某种原因,我需要显式地使用
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

这里变量的名称(clang,scan\u build)是字符串
列表中的字符串,除了“-”被替换为“\u”,并且值是字符串的真正位置(由某些函数生成,用作unix
,它
).

来自
locals()返回的有关词典的文档

注意

本词典的内容不得修改;更改可能不会影响解释器使用的本地变量和自由变量的值


从技术上讲,您可以使用
eval
,但我会找到另一种方法来满足您的需求:

print(eval("x"))
另外,
local=locals()

如果要动态存储变量,只需使用普通dict和键访问:

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并将返回的值传递给其他函数。

您不能动态分配给局部变量。由于您没有编写实际的用例,我只能给出一个常见的用例:您有一些带有默认值的字典:

def hello(values):
    x = values.get('x', 1)
    y = values.get('y', 2)
    z = values.get('z', 3)
    print(x)

不要和当地人乱搞。使用字典:

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上):


您不能分配给
locals()
;这是记录在案的行为。它只在一个方向上反映本地名称。你能提供更多的背景吗?这里的问题是:你想做什么?您不能也不应该像这样动态创建变量。您的更新并不能真正回答您要做什么的问题。@MartijnPieters只是更新了一点。
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
"no-name" not found
{'clang': '/usr/bin/clang', 'xml2_config': '/usr/bin/xml2-config'}