can';在python函数中找不到用exec声明的变量

can';在python函数中找不到用exec声明的变量,python,exec,Python,Exec,我试图在函数中使用函数exec声明python变量。例如: def func(): varnames = ['x', 'y', 'z'] vals = [5,5,'abc'] exec(varnames[0] + '=vals[0]') print(x) func() 导致错误的原因: NameError: global name 'x' is not defined 然而,“x”在locals()中确实存在 结果: {'vals': [5, 5, 'ab

我试图在函数中使用函数exec声明python变量。例如:

def func():
    varnames = ['x', 'y', 'z']
    vals = [5,5,'abc']
    exec(varnames[0] + '=vals[0]')
    print(x)


func()
导致错误的原因:

NameError: global name 'x' is not defined
然而,“x”在locals()中确实存在

结果:

{'vals': [5, 5, 'abc'], 'x': 5, 'varnames': ['x', 'y', 'z']}

显示x存在于本地命名空间中。你知道为什么会发生这种情况,或者我可以怎样解决吗?

你可以通过将函数
func()
中的print语句从
print(x)
更改为
print(locals()['x'])
来解决这个问题。您的代码现在如下所示。(在Python3.3.4上测试)在Python2和Python3之间,“exec”命令从语句更改为函数,从而更改了范围

def func():
    varnames = ['x','y','z']
    vals = [5,5, 'abc']
    exec(varnames[1] + '=vals[1]')
    print(locals()['y'])

您可以通过将函数
func()
中的print语句从
print(x)
更改为
print(locals()['x'])
来解决这个问题。您的代码现在如下所示。(在Python3.3.4上测试)在Python2和Python3之间,“exec”命令从语句更改为函数,从而更改了范围

def func():
    varnames = ['x','y','z']
    vals = [5,5, 'abc']
    exec(varnames[1] + '=vals[1]')
    print(locals()['y'])

您可以通过将函数
func()
中的print语句从
print(x)
更改为
print(locals()['x'])
来解决这个问题。您的代码现在如下所示。(在Python3.3.4上测试)在Python2和Python3之间,“exec”命令从语句更改为函数,从而更改了范围

def func():
    varnames = ['x','y','z']
    vals = [5,5, 'abc']
    exec(varnames[1] + '=vals[1]')
    print(locals()['y'])

您可以通过将函数
func()
中的print语句从
print(x)
更改为
print(locals()['x'])
来解决这个问题。您的代码现在如下所示。(在Python3.3.4上测试)在Python2和Python3之间,“exec”命令从语句更改为函数,从而更改了范围

def func():
    varnames = ['x','y','z']
    vals = [5,5, 'abc']
    exec(varnames[1] + '=vals[1]')
    print(locals()['y'])

很可能您使用的是Python3,
exec
已经不能再做这样的事情了。是的,没错,我使用的是Python3。因此,在Python3中,不可能有一个字符串用作变量名:@AshwiniChaudhary have
LOAD\u NAME
在py3中不再是这样的东西。我想您的解决方法是强制进行局部变量查找:
print(locals()['x'])
。我想这个解决方案的问题是,我希望最终使用第二个位置参数exec(varnames[0]+'=vals[0]',globals())使新创建的变量成为全局变量。但是,这不起作用,因为只能在本地名称空间中找到VAL。有没有想过我该如何解决这个问题?我应该说你已经帮了大忙了。谢谢很可能您使用的是Python3,
exec
已经不能再做这样的事情了。是的,没错,我使用的是Python3。因此,在Python3中,不可能有一个字符串用作变量名:@AshwiniChaudhary have
LOAD\u NAME
在py3中不再是这样的东西。我想您的解决方法是强制进行局部变量查找:
print(locals()['x'])
。我想这个解决方案的问题是,我希望最终使用第二个位置参数exec(varnames[0]+'=vals[0]',globals())使新创建的变量成为全局变量。但是,这不起作用,因为只能在本地名称空间中找到VAL。有没有想过我该如何解决这个问题?我应该说你已经帮了大忙了。谢谢很可能您使用的是Python3,
exec
已经不能再做这样的事情了。是的,没错,我使用的是Python3。因此,在Python3中,不可能有一个字符串用作变量名:@AshwiniChaudhary have
LOAD\u NAME
在py3中不再是这样的东西。我想您的解决方法是强制进行局部变量查找:
print(locals()['x'])
。我想这个解决方案的问题是,我希望最终使用第二个位置参数exec(varnames[0]+'=vals[0]',globals())使新创建的变量成为全局变量。但是,这不起作用,因为只能在本地名称空间中找到VAL。有没有想过我该如何解决这个问题?我应该说你已经帮了大忙了。谢谢很可能您使用的是Python3,
exec
已经不能再做这样的事情了。是的,没错,我使用的是Python3。因此,在Python3中,不可能有一个字符串用作变量名:@AshwiniChaudhary have
LOAD\u NAME
在py3中不再是这样的东西。我想您的解决方法是强制进行局部变量查找:
print(locals()['x'])
。我想这个解决方案的问题是,我希望最终使用第二个位置参数exec(varnames[0]+'=vals[0]',globals())使新创建的变量成为全局变量。但是,这不起作用,因为只能在本地名称空间中找到VAL。有没有想过我该如何解决这个问题?我应该说你已经帮了大忙了。谢谢