我有一个python脚本作为字符串,例如:
exec("sent = {'test': 1}")
global sent
print(sent)
我使用exec函数执行了它,然后使用global
python命令访问了变量。这种方法可以在不使用类的情况下正常工作,但是当我在类中具有相同的代码时,例如:
class example:
def fun1(self):
exec("sent = {'test': 1}")
global sent
print(sent)
v = example()
print(v.fun1())
我收到以下错误:
NameError: name 'sent' is not defined
答案 0 :(得分:1)
您确实应该避免使用全局变量。无论如何,这是如何做:
class example:
def fun1(self):
# globals sent # Not needed in this special case.
exec("sent = {}", globals())
print('in fun1, "sent" is now', sent )
v = example()
print(v.fun1()) # Result will be None because fun1() doesn't return anything.
print('after call to fun1(), global "sent" is', sent)
输出:
in fun1, "sent" is now {}
None
after call to fun1(), global "sent" is {}
global
声明仅在函数或类方法内执行某项操作,甚至在将全局变量的值设置为某项时才需要。
但是,作为一种特殊情况,fun1()
方法中实际上并不需要一个,因为它在调用globals()
时显式传递了exec()
(但不是一个单独的本地字典)。无论如何都要放一个以使之更清楚是一个好主意。
在documentation中说明了使用exec()
的方式:
如果仅提供全局变量,则必须为字典,将同时用于 全局变量和局部变量。
(重点是我的)
这是一种避免在该方法中完全引用全局变量的方法:
class example:
def fun1(self):
namespace = {}
exec("sent = {}", namespace)
sent = namespace['sent'] # Retrieve result.
print('in fun1, "sent" is now', sent )
return sent
v = example()
sent = v.fun1()
print('after calling fun1(), "sent" got set to', sent)
输出:
in fun1, "sent" is now {}
after calling fun1(), "sent" got set to {}
答案 1 :(得分:1)
您没有通过全局词典进行修改。试试:
exec("sent = {}",globals())