在python中写游戏引擎的时候经常会用到exec执行脚本命令和getattr动态调用函数
但是……使用exec执行脚本命令时,exec对外界变量的可访问性如何?外界对exec中的变量的可访问性又如何?

经过本大地一个简单的小测试后,大概结论如下
结论1:exec在最外层时后续的代码可以访问其中声明的变量,可以调用外部的函数
结论2:exec在最外层时在其中对变量进行的修改对外部有效
结论3:在函数中使用exec,对于简单的数据类型使用了值传递的方式,即exec中进行声名和修改对外部无效;但是全局变量的声明和修改是有效的;其定义的变量能被后面的exec访问但不能被本身的函数体访问
结论4:在类成员函数中exec可以定义、访问和修改类的成员;但是其中定义的普通变量只能被后面的exec访问(喵的好神奇!)
结论5:exec在最外层时后续的代码可以访问其中声明的函数和类

然后以下是测试过程

# -*- coding:utf-8 -*-
'''
Created on Jun 28, 2013
python中用exec执行脚本命令的变量可访问性的小测试 (python3.3)
@author: 大地无敌 - /404.html#www.agrp.info/
'''
 
#1、在最外层执行exec声明变量
exec ('test = 'miao'' )
print (test ) #输出miao
 
#结论1:exec在最外层时后续的代码可以访问其中声明的变量,可以调用外部的函数
 
 
#2、普通修改和函数调用的测试
def plus( mm):
    return mm + 'World!'
= 'Hello '
exec ('k = plus(k)' )
print (k ) #输出Hello World!
 
#结论2:exec在最外层时在其中对变量进行的修改对外部有效
 
#3、在函数中使用exec
def main():
    test2 = 1
    exec ('test2 = test2+233nabc=3nprint(test2)' ) #输出的是234
    exec ('print(test2)' ) #输出的是1
    exec ('global test3ntest3 = test2' )
    exec ('test4 = 'How about this?'' ) #输出How about this?
    exec ('print(test4)' )
    print (test2 ) #1而不是2,说明在函数中用exe没有改变函数中的变量
    print (test3 ) #输出的是1
    #print(test4) #会认为test4未定义
 
main ()
#print(test2) #会认为test2未定义,说明在函数中用exec访问的不是模块中的变量
print (test3 ) #输出的是1
 
#结论3:在函数中使用exec,对于简单的数据类型使用了值传递的方式,即exec中进行声名和修改对外部无效;但是全局变量的声明和修改是有效的;其定义的变量能被后面的exec访问但不能被本身的函数体访问
 
#4、类(构造)函数中的测试
class Test2:
    def __init__ (self ):
        exec ( "self.age = 20")
        exec ( "abc = 65535")
        exec ( "print(abc)") #65535
        #print(abc)  #会认为abc未定义
 
test2 = Test2 ()
print (test2 .age ) #输出的是20
#print(abc) #会认为abc未定义
#exec("print(abc)") #会认为abc未定义
 
#结论4:在类成员函数中exec可以定义、访问和修改类的成员;但是其中定义的普通变量只能被后面的exec访问(喵的好神奇!)
 
#5、在exec中定义函数和类
exec ('def test():n    print('hahahaha')n' )
test () #输出hahahaha
exec ('class MyObject():n    def __init__(self):n        print('OKOK!')n    def test(self):n        print('Hello')' )
myObject = MyObject () #OKOK
myObject .test () #Hello
 
#结论5:exec在最外层时后续的代码可以访问其中声明的函数和类
 
 
input ("nya!" )
'''
在会出现异常的代码都注释掉后的最终输出如下:
miao
Hello World!
234
1
How about this?
1
1
1
65535
20
hahahaha
OKOK!
Hello
nya!
'''

 

注意 在Python2.7 中 结果是

miao
Hello World!
234
234
How about this?
234
234
234
65535
20
hahahaha
OKOK!
Hello
nya!

也就是说在函数中使用exec对简单变量进行的声明和修改在python2.7中会反映到外界