|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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@戴宇轩
|
|