python:我可以在模块本身中导入模块名称空间吗?

python:我可以在模块本身中导入模块名称空间吗?,python,scope,python-module,Python,Scope,Python Module,由于变量名称在函数中有赋值时被声明为局部变量,并且我想从函数中访问模块变量,因此我可以在模块中导入模块名称,然后使用该名称访问模块变量吗 示例(文件名:server.py): 你不能像那样导入它,你也不需要。只需直接使用模块全局变量 def foo(): global bar bar = 10 您需要将其声明为全局变量,以便设置它,而不是创建局部变量。您不能这样导入它,也不需要这样做。只需直接使用模块全局变量 def foo(): global bar bar

由于变量名称在函数中有赋值时被声明为局部变量,并且我想从函数中访问模块变量,因此我可以在模块中导入模块名称,然后使用该名称访问模块变量吗

示例(文件名:server.py):


你不能像那样导入它,你也不需要。只需直接使用模块全局变量

def foo():
    global bar
    bar = 10

您需要将其声明为全局变量,以便设置它,而不是创建局部变量。

您不能这样导入它,也不需要这样做。只需直接使用模块全局变量

def foo():
    global bar
    bar = 10
您需要将其声明为全局变量,以便设置它,而不是创建局部变量。

为什么不:

def foo():
  global bar
  bar = 10
为什么不:

def foo():
  global bar
  bar = 10

否,请改用全局语句:

def foo():
    global bar
    bar = 10

否,请改用全局语句:

def foo():
    global bar
    bar = 10

不要像所有其他答案中所建议的那样使用
global
语句,不要使用模块级变量,而是将类用作容器,或者仅针对全局使用另一个模块:

# mg.py

bar = 5

# server.py
import mg

def foo():
    mg.bar = 10

这样你就不需要把
global
语句放在任何地方,你可以重复使用这些名称,你所指的
bar
就很清楚了

编辑:此外,可以在模块内部导入模块,但不能以这种方式更改主模块中的变量。因此,这将起作用:

# selfimport.py
import selfimport

def foo():
    print selfimport.foo

bar = 3

if __name__ == '__main__':
    print selfimport.bar
    foo()
但这不会:

# selfimport.py
import selfimport

bar = 3

def foo():
    selfimport.bar = 5

if __name__ == '__main__':
    print selfimport.bar
    foo()
    print bar # bar is still 3!

如果您只使用globals作为常量,那么无论如何都不需要
global
语句。您还需要确保将只希望在主模块中执行的代码封装在上述
if
语句中,否则将递归。

不要像所有其他答案中建议的那样使用
global
语句,而不要使用模块级变量,但是一个类作为容器或另一个模块仅用于全局:

# mg.py

bar = 5

# server.py
import mg

def foo():
    mg.bar = 10

这样你就不需要把
global
语句放在任何地方,你可以重复使用这些名称,你所指的
bar
就很清楚了

编辑:此外,可以在模块内部导入模块,但不能以这种方式更改主模块中的变量。因此,这将起作用:

# selfimport.py
import selfimport

def foo():
    print selfimport.foo

bar = 3

if __name__ == '__main__':
    print selfimport.bar
    foo()
但这不会:

# selfimport.py
import selfimport

bar = 3

def foo():
    selfimport.bar = 5

if __name__ == '__main__':
    print selfimport.bar
    foo()
    print bar # bar is still 3!

如果您只使用globals作为常量,那么无论如何都不需要
global
语句。您还需要确保将您只希望在主模块中执行的代码包装在一个
if
语句中,否则您将递归。

这是错误的,您可以这样导入它(不是您应该这样)。从技术上讲,您可以,但这样做会得到一些非常奇怪的结果。所以你不能期望它100%可靠地工作。我不确定你的意思是什么,如果你按照我的建议去做,并且包装你只想在
的主模块中使用的代码,如果
,你应该做什么?@agf,这根本不起作用。您将有两个
服务器
模块实例。
foo()
方法认为它正在设置自己的模块
bar
,但事实并非如此。这种自导入方法可能看起来有效,但实际上无效。你是对的。我习惯于只使用全局变量作为常量,我没有想到这一点。我会更正我的答案。这是错误的,你可以像那样导入它(不是你应该导入的)。从技术上来说你可以,但是你可以通过这样做得到一些非常奇怪的结果。所以你不能期望它100%可靠地工作。我不确定你的意思是什么,如果你按照我的建议去做,并且包装你只想在
的主模块中使用的代码,如果
,你应该做什么?@agf,这根本不起作用。您将有两个
服务器
模块实例。
foo()
方法认为它正在设置自己的模块
bar
,但事实并非如此。这种自导入方法可能看起来有效,但实际上无效。你是对的。我习惯于只使用全局变量作为常量,我没有想到这一点。我会更正我的答案,所以你建议隐藏全局变量并依赖隐式机制,而不是显式指示全局变量的用法。我倾向于认为这是一个有害的建议。不,我建议你不要使用全局变量,你可以通过使用属性访问标记来明确地引用这些变量(而不是在没有被分配到范围内时隐含的,就像你可以用全局变量做的那样)。。因此,与其显式指示全局变量的用法,不如建议将其隐藏并依赖隐式机制。我倾向于认为这是一个有害的建议。不,我建议你不要使用全局变量,并且你可以通过使用属性访问标记来明确地引用这些变量(而不是隐式地分配给范围内的,就像你可以用全局变量做的那样)。你不想只访问,你想改变它们。然后问题自然而然地来了:为什么你想这样做,而不是使用
global
语句,这恰恰是为了允许这样做?你使用的“变量”一词是不正确的。在其他语言中也有变量,这个词在内存块的意义上就像一个盒子,它的内容可以改变,但在Python中不能。Python中没有box变量,所有变量都是object。在Python中,“variable”一词唯一可以接受的用法是指定对象的名称,这是我在官方文档中看到它的唯一含义。但这里有一个特别的词:“标识符”。因此,在Python上下文中使用模棱两可且令人困惑的单词“variable”是没有道理的。I说,你不想只访问它们,你想更改它们。但这是我的一个假设。事实上,代码的动机是未知的,因为它是不完整的。您希望通过指令“server.bar=10”获得什么?“为什么?”这个问题对于理解你想要得到什么是次要的。你不想只想获得,你想改变它们。那么问题自然就来了