跨文件Python更改变量

时间:2017-05-04 23:06:49

标签: python

Heyo,我遇到了问题。 所以我有三个文件:

  1. 主程序
  2. 功能
  3. 数据
  4. 我希望主程序从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"。然而,令我失望的是,它打印为空白。它确实打印了初始文本值。

    我真的不知道为什么会这样。不应该更改文本变量吗?你能解释一下我的程序有哪些部分是错的,以及如何纠正它?

2 个答案:

答案 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)

很酷,我们有很多人说'#34;不要这样做!"。那么,那你该怎么办?执行此操作的好方法是将text变量传递给函数并将其传递给函数。像这样:

数据文件:

#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)

这解决了你的问题。你可能也应该像其他答案所暗示的那样摆脱*进口,但这是一个哲学问题。