Python 如何拥有一个非常局部的全局变量?
我发现很多时候我必须重置一些全局变量,否则只需读取 因此,我以以下片段结束:Python 如何拥有一个非常局部的全局变量?,python,global-variables,Python,Global Variables,我发现很多时候我必须重置一些全局变量,否则只需读取 因此,我以以下片段结束: if condition: global _global _global = None 是否有可能实现以下目标: if condition: global._global = None 我想做的是将“global”前缀限制为一条语句 注意:在这种特定情况下,这两条语句是绝对等效的,因为如果已经创建了一个局部范围,但如果代码的单位更大,则不是这样 这是“pythony可接受的”还是我被我的“前
if condition:
global _global
_global = None
是否有可能实现以下目标:
if condition:
global._global = None
我想做的是将“global”前缀限制为一条语句
注意:在这种特定情况下,这两条语句是绝对等效的,因为如果已经创建了一个局部范围,但如果代码的单位更大,则不是这样
这是“pythony可接受的”还是我被我的“前世”迷住了?你可以像这样使用del
关键字和globals()
:
del globals()["_global"]
您可以像这样使用del
关键字和globals()
:
del globals()["_global"]
嗯。。。我不想完全删除它,只是为了“清除”它,这样一个如果
就不会抱怨了。我想我可以写这样的东西:globals()[“\u global”]=None
,对吗?@ZioByte你可以这样做。如果未定义变量,请注意KeyError
。你应该在你的代码中处理它嗯,要处理可能的KeyError
s需要不止一行代码@ZioByte:FWIW,我认为globals()[“\u global”]=None
将是非音速的。嗯。。。我不想完全删除它,只是为了“清除”它,这样一个如果
就不会抱怨了。我想我可以写这样的东西:globals()[“\u global”]=None
,对吗?@ZioByte你可以这样做。如果未定义变量,请注意KeyError
。你应该在你的代码中处理它嗯,要处理可能的KeyError
s需要不止一行代码@ZioByte:FWIW,我认为globals()[“_global”]=None
将是非Python的。在我看来,从技术上讲,显式声明变量global
(请参见第二行)。很遗憾看到你在“前世”中显然没有尽可能多地避免全局变量。@martineau:事实上我学过,但我正在与“pythonic方式”作斗争;在这个特定的例子中,我将使用一个单例类,\u global
将是一个实例变量。在python中,他们告诉我“静态类”是作为模块实现的。。。我需要模块级变量!任何关于这个主题的建议(不仅仅是)都将是非常受欢迎的!注意:在这种特定情况下,模块处理某些硬件:拥有多个实例没有多大意义。在Python中,模块实际上是单例的。例如,如果在名为mymod
的模块(在名为mymod.py
的文件中)中定义了模块级变量foobar
,并在程序的主(或其他)脚本中定义了import mymod
,则可以通过引用mymod.foobar
来更改(以及删除)该变量。i、 e.mymod.foobar=None
——这样做会被认为是完全“pythonic”…附言。请注意,使用mymod导入foobar的然后执行foobar=None
将不起作用,因为您将只更改本地名称foobar
所指的值,而不是最初通过来自的分配给它的模块的值。。。导入
。在我看来,从技术上讲,显式声明变量全局
(请参阅本文第二行)更为“pythonic”。很遗憾看到你在“前世”中显然没有尽可能多地避免全局变量。@martineau:事实上我学过,但我正在与“pythonic方式”作斗争;在这个特定的例子中,我将使用一个单例类,\u global
将是一个实例变量。在python中,他们告诉我“静态类”是作为模块实现的。。。我需要模块级变量!任何关于这个主题的建议(不仅仅是)都将是非常受欢迎的!注意:在这种特定情况下,模块处理某些硬件:拥有多个实例没有多大意义。在Python中,模块实际上是单例的。例如,如果在名为mymod
的模块(在名为mymod.py
的文件中)中定义了模块级变量foobar
,并在程序的主(或其他)脚本中定义了import mymod
,则可以通过引用mymod.foobar
来更改(以及删除)该变量。i、 e.mymod.foobar=None
——这样做会被认为是完全“pythonic”…附言。请注意,使用mymod导入foobar的然后执行foobar=None
将不起作用,因为您将只更改本地名称foobar
所指的值,而不是最初通过来自的分配给它的模块的值。。。导入
。