python变量无法定义_为什么Python exec中的模块级变量无法访问?

我试图在

project中使用Python的执行程序来执行嵌入式Python代码.

我遇到的问题是,在exec语句中的模块级别创建的变量不能从同一模块中定义的函数访问.

假设你有以下Python程序:

x = 5

def foo():

print x

foo()

如果将上述四行放在一个文件中并运行它,那么它将无所谓.

但是,如果您尝试从exec语句中运行相同的代码,它将无法正常工作.

这是我们以前的程序,在一个exec语句里面:

import __builtin__

global_env = {'__builtins__': __builtin__}

local_env = dict()

exec """

x = 5

def foo():

print x

foo()

""" in global_env,local_env

执行时,而不是工作,它会产生以下错误:

Traceback (most recent call last):

File "lab.py",line 94,in

""" in global_env,local_env

File "",line 5,in

File "",line 4,in foo

NameError: global name 'x' is not defined

我认为模块级变量存储在全局范围内,但似乎至少在exec中,它们不是.

例如,在上一个示例中,如果将foo()的调用替换为:

print global_env

print local_env

你得到:

{'__builtins__': }

{'x': 5,'foo': }

所以在模块级(包括x)中定义的任何东西都存储在本地()中.

但是除了exec语句的模块级以外,从任何地方访问x是不可能的.特别是,如上所述,x的本地范围对同一个exec语句中定义的函数是不可见的.

解决方法

我找到了解决这个问题的两种方法,并使x再次访问.

第一个在函数中使用全局关键字:

exec """

x = 5

def foo():

global x

print x

foo()

""" in global_env,local_env

第二个在exec中使用与全局变量()和locals()相同的字典:

exec """

x = 5

def foo():

print x

foo()

""" in global_env

但是,这些只是解决原始问题的半修复/解决方法.

所以我的问题是:为什么exec中的模块级变量存储在本地,为什么从模块级到任何地方都不可访问?

一些密切相关的StackOverflow帖子:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值