python中全局变量的频率?

2024-03-18

Stack Overflow 有很多关于 python 中的全局变量的问题,它似乎给来自其他语言的人们带来了一些困惑。范围界定规则并不完全按照许多来自其他背景的人所期望的方式发挥作用。

同时,代码不应该在类级别上组织,而是在模块级别上组织。因此,当所有内容不一定包含在类中时,原本在成员变量中找到的状态可以放入模块级变量中。

所以我的问题分为两部分:

1)我应该避免使用全局变量(特别是在函数内设置它们并使用 global 关键字)?

2)如果#1是肯定的,是否有预期使用它们的常见模式?

我在一个充斥着许多不同语言的地方工作,我想减少混乱并确保 Python 爱好者以后不会讨厌我。

感谢您提供任何建设性意见。


我强烈建议您阅读这篇题为“Python 中的单例及其问题 http://lucumr.pocoo.org/2009/7/24/singletons-and-their-problems-in-python/。它让我重新思考我对全局变量的使用。一些选择引用:

但要小心。仅仅因为您没有实现单例设计模式,并不意味着您避免了单例的核心问题。单例的核心问题是全局共享状态。单例只不过是一个美化的全局变量,在像 Java 这样的语言中,有很多原因导致你想要使用像单例这样的东西。在 Python 中,我们对单例有一些不同的东西,它有一个非常无辜的名字,隐藏了血淋淋的细节:模块。

伙计们,这是对的:Python 模块是一个单例。它和单例模式有同样的问题,只是稍微差一点。

以下是具有这种共享状态可能导致的问题的一个示例:

为了不谈论无关紧要的事情,让我们看一下标准库中的模块之一,mimetypes 模块。

看一看:

inited = False

def init(files=None):
    global inited
    db = MimeTypes()
    ...

这是来自 Python 附带的 mimetypes 模块的实际代码,只是删除了更多血淋淋的细节。关键是,存在共享状态。共享状态是一个布尔标志,如果模块已初始化,则为 True;如果未初始化,则为 False。现在,这种特殊情况可能不是那么有问题(相信我,确实如此),因为 mimetypes 会自行初始化,但您可以看到 init 函数有一个 files 参数。如果将文件列表传递给该函数,它将使用这些文件中的 mime 信息重新初始化内存中的 mime 数据库。现在想象一下,如果你有两个库用两个不同的源初始化 mimetypes,会发生什么......

这是一个足够常见的模式,我自己也做过......但例如更好的方法是:init返回一个实现了所有方法的类的实例,其他部分的代码可以init获得具有不同参数的不同实例,这些参数不会干扰前者。 “缺点”是您必须将此实例传递给任何不想初始化新实例的代码,但“缺点”的优点是它使您的依赖项变得显而易见。

无论如何,简而言之,我会尽力避免它,但如果您可以接受具有隐式单例的代码,那么就使用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python中全局变量的频率? 的相关文章

随机推荐

  • 用于分隔 Excel 工作表的多个数据框列表

    我有一个可变长度的数据框列表 我想将每个数据框列表转换为每个 Excel 工作表 这是我的代码 for i in range 1 len dfs frames sheetName i dfs i for sheet df in frames
  • AlertDialog 不显示列表上的分隔线

    我有这门课 public class PageDetailInfoView extends FrameLayout few constructors and methods method to show an AlertDialog wit
  • GradleWorkerMain 内存不足错误

    我正在尝试对基于 ant 的 Netbeans RCP 项目进行 gradle 并发现奇怪的 gradle 行为 我用探查器进行了一些观察并得到了下一个结果 环境配置 Gradle 1 9 Build time 2013 11 19 08
  • include_directories 用于导入库

    我正在用 c 编写项目 并且在 cmake 中导入库时遇到问题 正在导入的第三方库不会传播包含目录 根目录 CMakeLists txt Top level CMakeLists txt cmake minimum required VER
  • OpenMp 根据变量设置并行循环的线程数

    有没有办法根据变量的值设置 OpenMP 并行区域的线程数 最初 整个应用程序的线程数 nofCores 在我的 AMD FX 8350 上 nofCores 8 对于这个区域 如果变量是 3 那么我只需要 3 个线程 如果变量 gt 核心
  • Twitter“无法验证您的身份”错误

    我正在使用 Rails 应用程序的 twitter gem 这样我就可以将我的博客文章自动更新到我的 twitter feed 上 我跟着gem 自述文件说明 https github com sferik twitter 将其放入 con
  • 有什么方法可以从内部函数中退出外部函数吗?

    在 PHP 中 如果我有一个函数调用另一个函数 有没有办法让被调用函数退出调用者函数而不杀死整个脚本 例如 假设我有一些类似的代码 p This is some text After this text I m going to call
  • 如何在seaborn catplot中旋转xticklabel

    我无法在 Seaborn Matplotlib 中旋转我的 xlabel 我尝试了很多不同的解决方案 但无法修复它 我在 stackoverflow 上看到了很多相关问题 但它们对我不起作用 我当前的绘图如下所示 但我希望 xlabel 旋
  • Django 检查查询集模型类型的最佳方法

    我有一个 Django 操作函数 我想在基于不同模型的查询集上使用它 检查我的查询集组成的模型类型的最佳方法是什么 假设我想检查 models py 中定义的 Library 类 目前我可以使用它来工作 for object in quer
  • 使用 CreateEvent 创建/打开已存在的事件是否会重置信号?

    如果我使用 CreateEvent 打开一个事件 responseWaitEvent CreateEvent NULL no security TRUE manual reset event FALSE not signaled LPTST
  • 将成员添加到 MailChimp 列表时出现 400 错误请求

    我正在发送一个POST请求以下资源 http developer mailchimp com documentation mailchimp reference lists members 并得到 400 我明白错误意味着什么 http d
  • 如何在标题中仅保留唯一值并在不同行中获取与这些值相对应的值?

    我有一个链接 在该链接中我有一些产品 每个产品中都有一个规格表 该表的第一列应为标题 第二列应为与其对应的数据 每个表的第一列都不同 有一些重叠的类别 我想要一张大表 其中包含所有这些类别 并且按行排列不同的产品 我能够获取一张表 一种产品
  • Android 使用 AccountManager 添加帐户

    大家好 我正在尝试使用 androids accountManager 添加帐户 我不断收到下面的堆栈跟踪 伙计们 我无法发布我的所有代码 因为我打破了 Stack Overflow 允许我输入的限制 因此 我只会发布您请求的代码片段 因为
  • 通过 ASP.NET Web API 有效使用 async/await

    我正在尝试利用async await我的 Web API 项目中的 ASP NET 功能 我不太确定它是否会对我的 Web API 服务的性能产生任何影响 请在下面找到我的应用程序的工作流程和示例代码 工作流程 UI应用程序 Web API
  • 组件的松耦合

    我创建了一个提供消息 电子邮件和短信的类库 程序集 该类库定义了一个接口 IMessenger EmailMessage 和 SmsMessage 类都实现了该接口 我认为这是一个通用库 它将成为我的基础设施层的一部分 并且可以 可以在任何
  • 微软机器人框架自行崩溃[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我收到这个令牌请求 error invalid request error description AADSTS90002 No
  • VS 代码评论面板

    我正在看 comments openPanel openOnSessionStartWithComments 在 VS Code 中设置 但我不太明白这是如何工作的 我在 Google 或 StackOverflow 上找不到任何关于此的信
  • 配置对象无效。 Webpack 已使用与 API 架构不匹配的配置对象进行初始化

    我有一个从在线课程创建的简单的 helloworld React 应用程序 但是我收到此错误 配置对象无效 Webpack 已使用初始化 配置对象与 API 架构不匹配 配置有一个未知属性 postcss 这些属性有效 object amd
  • 防止SDL程序消耗额外资源

    我正在设计应该在图像上展示开放简历的程序 我注意到基本 SDL 应用程序的概念非常糟糕 它由循环和延迟组成 while true while event is in buffer event process event event do s
  • python中全局变量的频率?

    Stack Overflow 有很多关于 python 中的全局变量的问题 它似乎给来自其他语言的人们带来了一些困惑 范围界定规则并不完全按照许多来自其他背景的人所期望的方式发挥作用 同时 代码不应该在类级别上组织 而是在模块级别上组织 因