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

时间:2015-03-30 13:13:35

标签: 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 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)。

4 个答案:

答案 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'}