【问题标题】:Python global variable does not work with user defined function of new filePython全局变量不适用于新文件的用户定义函数
【发布时间】:2018-10-09 14:54:55
【问题描述】:

当我运行下面的python代码时,结果是0、5

#file name main1.py
def getZ(x,y):
    global Z
    Z=x*x+y*y
    return Z

global X,Y,Z

X=1 
Y=2
Z=0
print(Z)
getZ(X,Y);
print(Z)

但是当我运行下面的文件时

#file name main2.py
import getZ

global X,Y,Z
X=1     
Y=2
Z=0
print(Z)
getZ.getZ(X,Y);
print(Z)

具有新的用户定义功能,

#file name getZ.py
def getZ(x,y):
    global Z
    Z=x*x+y*y
    return Z

结果为 0, 0

我无法理解这种情况。

谁能帮帮我?

感谢您的建议。

【问题讨论】:

  • global Z 只允许函数访问全局变量Z 从该文件。它对导入的文件中的Z 一无所知。要在所有文件中拥有真正全局的Z,您需要在要使用它的每个文件中使用from ... import Z - 除了这个(具有可以更改所有文件的值的变量)确实是糟糕的设计,这就是 Python 让你很难做到这一点的原因。
  • global 在全局范围内不做任何事情;它的唯一用途是将函数局部变量更改为全局变量in函数。

标签: python global-variables return-value user-defined-functions calling-convention


【解决方案1】:

Python 没有真正的全局变量,只有 模块 级别的全局变量。 getZ 访问的Z 是getZ.Z,而不是您在main2.py 中设置的__main__.Z。

这可行:

#file name main2.py
import getZ

X=1     
Y=2
getZ.Z = 0  # Set the value of the variable `getZ.getZ` looks for.
print(getZ.Z)
getZ.getZ(X, Y)
print(getZ.Z)

【讨论】:

  • 这确实可行,但重新绑定全局变量仍然是邪恶的。
  • 这取决于模块是如何定义的。如果使用它的函数是设计期望的,那么允许甚至鼓励更改模块级全局的值是完全合理的。这与定义一个函数来接受一个参数来配置它的行为并没有什么不同。
  • “黄金法则”确实是要被打破的,但只有在你完全理解了其中的含义之后……根据经验,很少有重新绑定全局代码会产生更好的代码的情况(更好 = 更多健壮且更易于理解)
【解决方案2】:

Python“全局变量”只是模块的全局变量,没有进程范围的全局变量,所以getZ.getZ() 设置了getZ.Z,而不是main2.Z。这是设计使然,这是一件好事(tm),进程范围的全局变量既是纯粹的邪恶,也是完全无用的。 FWIW,即使重新绑定模块全局变量也是邪恶的,应该尽可能避免(如果你重视你的精神健全,全局变量应该被视为常量)。

【讨论】:

    猜你喜欢
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多