Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何声明导入模块要使用的变量_Python - Fatal编程技术网

Python 如何声明导入模块要使用的变量

Python 如何声明导入模块要使用的变量,python,Python,我有一个名为my_module.py的模块 此模块内部有一个函数my\u函数: def myFunction(): print my_variable 显然,当调用此函数时,它会打印尚未在任何地方实例化的my_变量。因此,从模块内部调用myFunction()将导致执行崩溃 现在,除了my_module.py之外,我还有另一个名为my_app.py的脚本驻留在同一文件夹中 在my_app.py内部,我正在导入my_module.py并在其命名空间下实例化my_变量。实例化my_变量后,

我有一个名为my_module.py的模块 此模块内部有一个函数
my\u函数

def myFunction():
    print my_variable
显然,当调用此函数时,它会打印尚未在任何地方实例化的
my_变量
。因此,从模块内部调用
myFunction()
将导致执行崩溃

现在,除了
my_module.py
之外,我还有另一个名为
my_app.py
的脚本驻留在同一文件夹中

my_app.py
内部,我正在导入
my_module.py
并在其命名空间下实例化
my_变量。实例化
my_变量
后,我调用
my_module.myFunction()
,它将拾取
my_变量
并打印其上下文:

import module
module.my_variable = 'this variable is instantiated inside of another script'
module.myFunction()

虽然这种方法有效,但我想知道它是否设计得当。是否有其他方法来实例化导入模块之外的变量,以供此导入模块使用?

我不确定您试图实现什么,但通常最好不要变异“全局”变量。每次您想在代码中使用
my_function()
时,都必须先显式更改
my_变量
,如果其他函数/方法依赖它,这可能会触发代码中的副作用。最好的方法是重写
my\u函数()
,以便它接受
my\u变量作为参数

import module
module.my_variable = 'this variable is instantiated inside of another script'
module.myFunction()
虽然这种方法有效,但我想知道它是否设计得当

不,这不是正确设计的。一种正确的方法是显式地将值传递给函数

是否有其他方法来实例化导入模块外部的变量以供此导入模块使用

在声明此变量时,只需使用另一个模块。例如
my_vars.py

 my_variable = 'this variable is instantiated inside of another script'
import my_vars

def myFunction():
    print my_vars.my_variable
然后在
my_module.py
中:

 my_variable = 'this variable is instantiated inside of another script'
import my_vars

def myFunction():
    print my_vars.my_variable

术语挑剔:Python没有变量声明。但无论如何,听起来你应该把一个参数传递给函数,而不是依赖于全局状态……当然。而是用名字来引用它们。我不知道你在这里的意思。但是不管怎样,说你已经在Python中声明了一个变量是不对的,但是不管怎样,答案是否定的,Python没有真正的全局范围——很多人会认为这是一个好的东西——而“全局”范围实际上是模块级的范围。因此,事情保持相对简单的解释。有时我们需要一个全局范围变量。因此,导入的每个模块都能够访问相同的对象或变量。例如,数据库connecton对象可以作为“真正的”全局变量共享。假设程序中有几个模块需要DB连接对象。当然,我们可以在每个模块中实例化DB连接对象。或者,我们可以以这样的方式编写模块函数,它们将连接对象作为参数。但依我看,这是一项艰巨的工作。如果我们只实例化一个DB连接对象并使其可用于所有导入的模块,那么会简单得多。我猜您没有进行任何变异,只是试图在
my_模块
之外实例化
my_变量
,对吗?当然,
my\u函数
无法清楚地知道其包含范围之外的任何变量,即
my\u模块
。当您导入my_模块时,您将把my_模块中的名称绑定到my_应用程序中。这意味着您可以从
my_app
访问
my_模块
中的所有名称,而不是相反。然而,有一个黑客在它周围使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,这是非常危险的。因此,将
my_变量
作为参数传递仍然是最好的方法。但是,如果不编写函数以接受DB对象作为参数,则必须使用
\uuuuu builtin\uuuuu
使DB对象可用于所有导入的作用域,这也是一种非常危险的方法。