我希望主程序从Functions模块调用一个函数,它可以更改Data中的变量。然后我需要在主程序的其他地方使用新变量。
这就是我想要的,显示为简化的演示程序:
数据文件:
#data.py
#just an short depiction of my actual file
text = ""
函数文件:
#functions.py
from data import *
def printHi():
global text
text = "hi"
print(text)
主程序:
#mainProgram.py
from functions import *
from data import *
printHi()
print(text)
我期望会发生的事情是当我运行主程序时:
导入函数文件和数据文件。
然后它调用" printHi"函数文件中的方法。
变量" text"从数据文件中分配" hi",然后打印。
主程序打印"文本"变量
我认为文本变量将是" hi"。然而,令我失望的是,它打印为空白。它确实打印了初始文本值。
我真的不知道为什么会这样。不应该更改文本变量吗?你能解释一下我的程序有哪些部分是错的,以及如何纠正它?
答案 0 :(得分:2)
简短的回答根本就是不这样做。对于全局变量总是坏主意的所有原因,这是一个坏主意:因为它们导致堆栈溢出问题,如“如果我做这件事我不应该做,它做了我没想到的事情 - 为什么呢?它那样做?“正如你现在所读到的那样,这是最简单的答案,“这就是你不应该做那件事的原因。”
如果没有花更多的时间在这个问题上,那么长的答案有点超出我的意思,但是长期的呃答案很简单。当你执行那些“星级”导入(from modulename import *
)时,你将重新绑定变量的名称。 functions.printHi
认为text
的内容不是data.text
,而是functions.text
。当它在printHi
中更改后,它会更改functions.text
,这应该仍然可以,因为mainProgram
也在导入functions
。
但请记住,mainProgram
实际上并未导入functions
,而是from functions import *
。这意味着mainProgram
认为text
既不是data.text
也不是functions.text
,而是mainProgram.text
。当functions.printHi
更改functions.text
时,它不会触及mainProgram.text
。
简短的回答适用于此,因为除非您能够深入思考您的代码以理解它们,否则这些陷阱是不明显的。如果你能够深入思考你的代码,你应该能够写出一些可以完全避开这些陷阱的东西。例如:“全球可变状态”通常是一件坏事。避免它。
要完成这项工作,请删除所有“明星”导入。以下代码有效:
# functions.py
import data
def printHi():
# plus! You don't need the `global` anymore.
data.text = "hi"
print(data.text)
# mainProgram.py
import functions
import data
functions.printHi() # prints "hi" from inside functions.printHi
print(data.text) # also prints "hi"
答案 1 :(得分:2)
数据文件:
#data.py
#just an short depiction of my actual file
text = ""
函数文件:
#functions.py
from data import *
def printHi(atext):
atext = "hi"
print(atext)
return atext
主程序:
#mainProgram.py
from functions import *
from data import *
text = printHi(text)
print(text)
这解决了你的问题。你可能也应该像其他答案所暗示的那样摆脱*进口,但这是一个哲学问题。