【问题标题】:(python) Should my variable be local or global? (best practice)(python) 我的变量应该是本地的还是全局的? (最佳实践)
【发布时间】:2013-04-06 12:57:31
【问题描述】:

当声明一个只用于一个函数的常量时,该变量应该在本地声明,因为它只由该函数使用,还是全局声明,因为它永远不会改变?

IE哪个更好:

CONSTANT = (1, 3, 5, 8)

##SOME OTHER CODE HERE

def function1(arg):
    if arg in CONSTANT:
        do something

或:

def function1(arg):
    CONSTANT = (1, 3, 5, 8)
    if arg in CONSTANT:
        do something

我知道这两者之间没有太大区别,但我只是想知道这两种做法中的哪一种更受欢迎,因为我刚刚开始并想养成良好的习惯。

【问题讨论】:

  • 好问题。 :) 但是CONSTANT 是否被多次使用?该示例表明不,但您可能想澄清这一点。如果你只使用一次,几乎不需要给它起名字,所以你可能想表明你真的打算在函数中多次使用它。
  • 就我个人而言,我更喜欢命名事物,即使我认为我不会使用它们两次,通常带有一个很好的注释来解释常量的含义。我非常支持在我的表达式中不使用文字,尤其是如果它们被多次使用。但在它们只使用一次的情况下,我可以按照您的方式进行查看。

标签: python variables coding-style global-variables local-variables


【解决方案1】:

我会将其保留在本地。如果需要,您可以随时将其移动到全局,或者通过在类中将它们设为方法并将常量转换为类变量来在函数之间共享它。在这些情况下,一般来说,越局部越好,最好将实现信息隐藏在您的函数中,如您的第二个示例中所示。在这里并没有太大的不同,但是随着您的项目变得更大,可维护性和模块化将保持不变。

【讨论】:

  • 常量是本地版本创建一次还是每次调用一次?
  • @JoachimIsaksson:它只会在文件加载时创建一次。它将留在记忆中。
  • 即使该值仅创建一次,它也会在每次执行时再次存储在 CONSTANT 变量中(使用 CPython 2.7.3)。这可以通过dis.dis()看到。
【解决方案2】:

我会将它们放在全球范围内,因为:

  1. 你的变量常量
  2. 在 Python 中,全局作用域被封装在模块命名空间中,这意味着您的变量实际上只是模块内部的全局变量。
  3. 如果您多次调用您的函数,并将常量放在本地,它会在您每次调用该函数时重新分配它们。
  4. 然后您可以在不同的函数之间共享您的常量。

但是,如果您转向面向对象编程,那么我会将常量作为类变量。

【讨论】:

  • 常量不会每次都重新分配。它们被分配一次并通过引用来引用。
  • 对于 (1),我不确定我是否明白你的意思。对于(2),当然,模块变量不像内置函数那样“全局”,但这有点离题。反对真正全局变量的相同基本论点适用于局部范围以上的任何级别,只是程度较小。将此逻辑扩展到具有数百个函数的项目,您就会开始有一堆变量,这些变量并不真正接近与它们相关的实际代码。函数开始消失,留下它们未附加的常量。对我来说,(3) 是过早优化,(4) 是 YAGNI。
【解决方案3】:

我想说什么是最好的取决于情况

如果执行时间不是问题,那么每次将常量加载到新变量中不会浪费太多时间。这有一个明显的优势,可以显式地显示代码中常量的使用位置。

否则,全局很好,但我只会出于优化目的这样做。如果我想起来,优化是我问自己和你一样的问题的唯一原因。

使用全局变量可能还有其他充分的理由:

  • 如果您的程序的用户经常需要在代码中更改其值并且您不想解析程序参数,
  • 如果其他程序需要访问它,

最后,我想说:做你认为最好的事情,但尽可能合理地将事物封装在它们所属的地方(本地人比全局人更受欢迎)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多