需要一个解决方案或解决方法来从moduleB中读取和编写moduleA中的变量。这是代码:
moduleA
import moduleB
variable = 10
def changeVariable():
global variable
variable = 20
def main():
print("From moduleA, variable =", variable, " before change.")
moduleB.main()
print("From moduleA, variable =", variable, " after change.")
if __name__ == "__main__":
main()
moduleB
import moduleA
def main():
print("From moduleB, variable =", moduleA.variable, " before change.")
moduleA.variable = 20 # Try 1
moduleA.changeVariable() # Try 2
print("From moduleB, variable =", moduleA.variable, " after change.")
if __name__ == "__main__":
main()
运行moduleA时,我们得到:
这是使用静态变量的另一个例子:
moduleAA
import moduleBB
class AA:
variable = 0
@staticmethod
def changeVariable():
AA.variable = 20
def main():
AA.variable = 10
print("From moduleAA, variable =", AA.variable, " before change.")
moduleBB.main()
print("From moduleAA, variable =", AA.variable, " after change.")
if __name__ == "__main__":
main()
moduleBB
import moduleAA
def main():
print("From moduleB, variable =", moduleAA.AA.variable, " before change.")
moduleAA.AA.variable = 20 # Try 1
moduleAA.AA.changeVariable() # Try 2
print("From moduleB, variable =", moduleAA.AA.variable, " after change.")
if __name__ == "__main__":
main()
运行moduleAA时,我们得到:
答案 0 :(得分:1)
当您执行moduleA
时,您将其作为脚本运行 - 本质上是一个名为__main__
的模块,而不是正常的'模块,以及它是如何加载的。如果您在开始sys.modules
后立即查看moduleB
(导入moduleA
之前),那么您将找不到__main__
,但您会找到模块variable
(很快就会持有值为10
的{{1}}。
然后当您导入moduleB
时,它会导入moduleA
- Python会尝试查找已加载的moduleA
但是没有任何内容,所以它会尝试从中加载moduleA
磁盘和瞧!它被加载,但这次是moduleB
。 Python然后查找从moduleA
导入的moduleA
,并且因为它已经存在,所以尽管存在循环依赖性,它并没有对它做任何大惊小怪(如果你有类似的东西)在你的代码中 - 你做错了。)
无论如何,由于它现在已加载为if __name__ == "__main__":
,因此其moduleB
块的评估结果为false,因此不会引起任何额外的麻烦。 if __name__ == "__main__":
继续执行,但它也不匹配其__main__
块,因此只是加载并坐在那里。
现在我们回到我们moduleA
if __name__ == "__main__":
的{{1}}表示中 - 其main()
块的计算结果为true,因此它调用其moduleB
函数,调用main()
' variable
函数,然后更改moduleA
值,但在__main__
,而不是__main__
。所以,现在当它回到variable
并尝试读取自己的10
值时,它会获得print(getattr(sys.modules["moduleA"], "variable"))
的未更改版本。但是如果你要打印出来:moduleB
你发现moduleA
确实改变了main
的变量。
如果您真的想在moduleB
强制进行更改,请尝试使用import sys
def main():
moduleA = sys.modules["__main__"] # this is the executing `moduleA` in your case
print("From moduleB, variable =", moduleA.variable, " before change.")
moduleA.variable = 20
print("From moduleB, variable =", moduleA.variable, " after change.")
if __name__ == "__main__":
main()
:
moduleA
从('From moduleA, variable =', 10, ' before change.')
('From moduleB, variable =', 10, ' before change.')
('From moduleB, variable =', 20, ' after change.')
('From moduleA, variable =', 20, ' after change.')
运行您的测试用例将打印出来:
moduleB
这就是这里发生了什么,而静态变量的例子也是如此 - 你一直都在针对“错误”这个问题做出反应。模块构成您的CREATE NONCLUSTERED INDEX OPTIM_1 ON MemberBetDetail(MemberCode ASC, CurrencyCode ASC, BetStatusId ASC)
INCLUDE (colYouNeed1, colYouNeed2, ColYouNeed3)
。无论哪种方式,请不要在任何类型的生产代码或任何其他开发人员可能最终不得不弄乱您的代码的情况下执行此操作 - 循环冗余是所有事情的好事。