马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 lightninng 于 2015-5-16 23:07 编辑
问题已经解决结论和经验如下:
1、在两个模块中如果有相互导入的现象(如问题中a.py中的import b 和b.py中的import a),那么在递归导入两次后,python自动停止循环导入。虽然python有这种自带的安全机制 ,但是还是应该避免两个模块的递归调用。请看3,4,5楼
2、在导入某一个模块时,实际会将该模块的所有内容运行一次(这也是下面问题中为何只有两个print语句,但会打印四条信息,因为相互导入会导致a.py运行了两次),为了防止这种情况的发生,需要把除了函数和类定义之外的语句放在if __name__ == '__main__':这条语句后面的同一缩进的语句块中,防止递归调用的发生,这个我自己试过了,import b时,b.py中包含在if __name__ == '__main__':中的语句并未被执行,其它 的语句都执行了一次
原问题如下:
今天在看到鱼油的一个问题的时候,试着动手 解决了一下,结果出现了一个神奇的现象,其实之前我用numpy模块的时候也出现过类似的问题,所以拿出来问一下:
1、有两个代码文件a.py和b.py
第一个文件a.py的内容如下"""a.py"""
import sys, os
sys.path.append(os.getcwd())
import b
value = 1
class NewClass(object):
def set(self):
global value
value = 6
a_class = NewClass()
a_class.set()
c = b.increase()
print(c)
print(type(c))
第二个文件,b.py的内容如下"""b.py"""
import sys, os
sys.path.append(os.getcwd())
def increase():
import a
a.value =a.value+1
return a.value
运行a.py如果如下>>> ================================ RESTART ================================
>>>
7
<class 'int'>
8
<class 'int'>
>>>
2、另外自己动手将b.py中的increase函数直接放到a.py中,即value = 1
class NewClass(object):
def set(self):
global value
value = 6
def increase():
result = value+1
return result
a_class = NewClass()
a_class.set()
c = increase()
print(c)
print(type(c))
运行结果如下请高手来解答,这个情况到底肿么回事,我用的python3.3.2,64位win 7
@~风介~ @wei_Y@戴宇轩
|