功能问题中的功能

时间:2017-01-28 08:12:24

标签: python python-3.x

我是一名Python和一般编程菜鸟。只编程了大约2周。我有关于python函数的快速问题。 有人可以解释为什么这样有效:

import random
valuea = valueb = valuec = "0"
stationary = "X"
def func1():
    print("",valuea,"\n",valueb,"\n",valuec)
    return
random.seed(0)
random_list = ("valuea","valueb","valuec")
random_result = random.choice(random_list)
locals()[random_result] = stationary
func1()

结果:

 0 
 X 
 0

但是,这不起作用:

def func1():
    import random
    valuea = valueb = valuec = "0"
    stationary = "X"
    def func2():
        print("",valuea,"\n",valueb,"\n",valuec)
        return
    random.seed(0)
    random_list = ("valuea","valueb","valuec")
    random_result = random.choice(random_list)
    locals()[random_result] = stationary
    func2()
    return
func1()

结果:

 0 
 0 
 0

有没有办法让它在第二种情况下工作,坐在函数内?

1 个答案:

答案 0 :(得分:0)

让我们看一个更简单的例子:

def func1():
    a = 0
    def func2():
        print(a)
    locals()['a'] = 1
    print(a)
    func2()

func1()
print(a)

此输出

0
0
1

即。两个函数的局部变量a未被修改。查看locals的文档,可以发现" ...更改可能不会影响解释器使用的本地和自由变量的值。"因此,用它来改变局部变量的值可能会也可能不会起作用......

相反如果您想将值与名称相关联,我建议您使用字典:

def func1():
    d = {'a' : 0}
    def func2():
        print(d['a'])
    d['a'] = 1
    print(d['a'])
    func2()

func1()
print(d['a'])

导致以下输出:

1
1
Traceback (most recent call last):
  File "...", line 10, in <module>
    print(d['a'])
NameError: name 'd' is not defined

由最后一行引起的异常是正确的行为,因为d仅在func1内定义。因此,在func1范围之外无法访问它。

您可以阅读有关范围的更多信息,例如here