【问题标题】:Global variables scope in modules模块中的全局变量范围
【发布时间】:2018-03-06 05:31:10
【问题描述】:

以下是我的文件和输出。我想做的就是在func1() 之后将x 的值设为20I have already referred to this answer。我想知道为什么这不起作用?有必要用import globalVar代替from globalVar import *

globalVar.py

#globalVar.py
x=10

fun1.py

from globalVar import *

def func1():
    global x
    x=20
    print("X in fun1",x)

main.py

from fun1 import *
from globalVar import *

print("X before fun1=",x)
func1()
print("X after fun1=",x)

输出:

X before fun1= 10  
X in fun1 20  
X after fun1= 10

【问题讨论】:

    标签: python scope global-variables


    【解决方案1】:

    更新答案:

    试试这个:

    GlobalVar.py:

    global x
    x = 10
    

    fun1.py:

    import GlobalVar
    
    def func1():
        GlobalVar.x = 20
        print("X in fun1", GlobalVar.x)
    

    ma​​in.py:

    from fun1 import *
    from GlobalVar import *
    
    print("X before fun1=", GlobalVar.x)
    func1()
    print("X after fun1=", GlobalVar.x)
    

    选中此项,这将根据您的问题为您提供所需的输出。

    希望对您有所帮助!谢谢! :)

    注意:全局表字典是当前模块的字典(在函数内部,这是定义它的模块,而不是调用它的模块)

    【讨论】:

    • 这并不能真正解释为什么
    • @Nae:你想了解什么?如果是关于全局变量或者我为什么这样做,请阅读this
    • @MayureshSardar:是的,以前的答案没有给出您想要的输出,我现在已经更新了答案,检查更新的答案。谢谢你:)
    • @MayureshSardar:更新/编辑的答案给出了您想要的输出
    • @Nae:它不会引发任何错误,因为我自己检查过。以及为什么答案是全局表字典是当前模块的字典(在函数内部,这是定义它的模块,而不是调用它的模块)。在这种情况下,他正在调用一个模块,在该模块中定义了他的全局变量,在调用并获取值时很好,但是在更改它时,您必须明确需要定义您正在更改在其他模块中定义的全局值,这就是为什么正如您在更新的答案中看到的那样,我确实喜欢这个(GlobalVar.x)。
    【解决方案2】:

    这不起作用的原因是 main.py 中的 fun1() 方法调用不返回 x 的更新值,即 20。 这就是为什么更新的 x 的范围仅在 fun1 中一旦执行结束,值就会丢失 & 当你第三次打印 x 的值时,它只是简单地引用回全局变量

    您可以采取以下措施使其发挥作用 1.fun1.py

    from globalVar import *
    
    def func1():
        global x
        x=20
        print("X in fun1",x)
        return x //here it returns the value of 20 to be found later
    

    2.globalVar.py

    x=10
    

    3.main.py

    from fun1 import *
    
    print("X before fun1=",x)
    x = func1()//here the updated value of x is retrived and updated, had you not done this the scope of x=20 would only be within the func1()
    print("X after fun1=",x)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2012-04-29
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多