我是一名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
有没有办法让它在第二种情况下工作,坐在函数内?
答案 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