您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – 确认import *和xxx导入之间的区别*

5b51 2022/1/14 8:22:40 python 字数 3915 阅读 536 来源 www.jb51.cc/python

我很惊讶地发现 import foo 和 from foo import * 对全球成员有不同的影响.我想确认我的实验是正确的行为. 在第一个示例中,更改模块foo中的成员将反映在导入foo的所有代码中.但是,在稍后的情况下更改该成员似乎只影响导入它的文件.换句话说,使用后面的方法将给每个导入文件自己的foo成员副本. 我想要的行为是从所有文件访问foo.x,可以从所有文件中更改它,并将所有文件(

概述

import foo

from foo import *

对全球成员有不同的影响.我想确认我的实验是正确的行为.

在第一个示例中,更改模块foo中的成员将反映在导入foo的所有代码中.但是,在稍后的情况下更改该成员似乎只影响导入它的文件.换句话说,使用后面的方法将给每个导入文件自己的foo成员副本.

我想要的行为是从所有文件访问foo.x,可以从所有文件中更改它,并将所有文件(这是真实的全局)反映在所有文件中.

一个

import foo

那么foo将成为引用模块foo的全局名称.当一个

foo.bar = 7

然后,引用并且加载对象foo.然后7存储在bar属性中.

当另一个模块导入foo时,它只将对象从sys.modules [‘foo’]中拉出,并获取修改的值.

一个

from foo import bar

全局变量()[‘bar’]设置为引用foo.bar.当一个人以后

bar = 7

全局变量()[‘bar’]不再引用foo.bar,但引用了一个7.的副本.也就是说,导入模块的全局范围中的原始绑定只是被替换.

在第一个示例中,一个修改存储在sys.modules中的对象的属性,并且对所有导入它的模块都是通用的.在第二个示例中,一个修改导入模块的全局范围.

如果有人要做一些事情

from foo import fobaz
 fobaz.foobar = 7

那么该更改将被传播到其他导入模块,因为一个不会覆盖全局引用,而是修改其指向的对象的属性.所以本质上,你应该能够修改可变对象,只要你不覆盖全局绑定.

我认为像这样的东西是最接近你将能够干净地获得一个真正的全球在python.作为一种语言,它极大地重视了命名空间.

总结

以上是编程之家为你收集整理的python – 确认import *和xxx导入之间的区别*全部内容,希望文章能够帮你解决python – 确认import *和xxx导入之间的区别*所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶