python:我可以在模块本身中导入模块名称空间吗?
由于变量名称在函数中有赋值时被声明为局部变量,并且我想从函数中访问模块变量,因此我可以在模块中导入模块名称,然后使用该名称访问模块变量吗 示例(文件名:server.py):python:我可以在模块本身中导入模块名称空间吗?,python,scope,python-module,Python,Scope,Python Module,由于变量名称在函数中有赋值时被声明为局部变量,并且我想从函数中访问模块变量,因此我可以在模块中导入模块名称,然后使用该名称访问模块变量吗 示例(文件名:server.py): 你不能像那样导入它,你也不需要。只需直接使用模块全局变量 def foo(): global bar bar = 10 您需要将其声明为全局变量,以便设置它,而不是创建局部变量。您不能这样导入它,也不需要这样做。只需直接使用模块全局变量 def foo(): global bar bar
你不能像那样导入它,你也不需要。只需直接使用模块全局变量
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”获得什么?“为什么?”这个问题对于理解你想要得到什么是次要的。你不想只想获得,你想改变它们。那么问题自然就来了