常量占用的内存比Python中的变量多吗?

时间:2016-03-27 17:23:54

标签: python python-3.x

我有人告诉我用变量替换代码中常用的常量。例如:

if a > 50:

有类似的东西:

b = 50
if a > b:
考虑到我的代码周围常常使用数字50的事实(例如,对于这些比较)。那怎么更好呢?为此目的的变量是否更符合内存,还是仅仅是为了编码风格?我使用的是Python 3.4

3 个答案:

答案 0 :(得分:6)

使用在中心位置设置的变量替换常量的想法不是关于内存管理,而是关于应用程序管理。常量应该是常量,但通常,对应用程序要求的更改需要调整这些常量的值。

因此,如果您有支票a > 50,可能会在将来某个时候检查a > 60。在这种情况下,您必须更新代码以反映新要求。

现在,使用常量的想法是,您只需要在中心位置调整这些数字。例如,您可以使用constants.py模块在​​中心位置声明所有重要常量,并且只执行检查a > constants.SOME_THRESHOLD。在这种情况下,当需求发生变化时,您只需要在一个地方更改常量值,而不是搜索所有使用该常量的地方。

这更为重要,如果你有不同的常量具有相同的值但意味着不同的东西。例如,有两个不同的常量用于检查,它们都以值50开始。现在,对于其中一个常量,值应更改为60。使用代码中的实际值,您现在需要在每次出现50时确定它应该是60还是留在50。但是使用集中式常量,您只需要更新常量,一切都能正常工作。

拥有常量变量也可以让您获得这些常量获得实际名称的好处。 50可能意味着什么;但如果有一个变量名,你可以给它一个名称来描述它应该是什么意思。

当然,拥有这样的集中常量对一切都没有意义。您应根据具体情况决定哪些常量值适合作为常量变量提取,哪些不适用。

就内存而言,当然在某个时刻声明变量需要将变量存储在某处。但变量非常便宜,所以它并不重要。并且该值最有可能被回收:对于小整数,Python甚至将实际的常量整数对象保留为缓存。

答案 1 :(得分:1)

通常魔术数字被认为是不好的风格。当我阅读您的代码时,可能不清楚是什么" 50"应该是的意思。分钟?美元吗?这就是你做MAX_MINUTES = 50之类的原因。取决于可能对其他人非常有帮助的代码,以了解其中发生的事情。

答案 2 :(得分:0)

由于您使用的是Python 3.4,我建议您使用IntEnum替换所有幻数。

这将使您的代码更容易理解,并在必要时更容易修改。

使用枚举的一个好处是你不能像使用变量那样偶然改变它们的值。

考虑这段代码;

import os
from hashlib import sha256

def compare(src, dest):
    """
    Compare two files.

    Arguments
        src: Path of the source file.
        dest: Path of the destination file.

    Returns:
        0 if source and destination are different
        1 source and destination are identical
        2 destination doesn't exist
        3 source doesn't exist
    """
    xsrc, xdest = os.path.exists(src), os.path.exists(dest)
    if not xsrc:
        return 3
    if not xdest:
        return 2
    with open(src, 'rb') as s:
        csrc = sha256(s.read()).digest()
    if xdest:
        with open(dest, 'rb') as d:
            cdest = sha256(d.read()).digest()
    else:
        cdest = b''
    if csrc == cdest:
        return 1
    return 2

这段代码本身并不清楚。记录和所有。 但是一旦你尝试使用返回值,你就不得不经常参考文档。

你能说出为什么下面的代码会做它的作用吗?并非没有参考compare的文档。

res = compare(file_a, file_b)
if res == 1 or res == 3:
    pass
elif res == 0:
    # copy file_a to file_b

现在看看这个;

import os
from hashlib import sha256
from enum import IntEnum

class Cmp(IntEnum):
    differ = 0  # source and destination are different
    same = 1  # source and destination are identical
    nodest = 2  # destination doesn't exist
    nosrc = 3  # source doesn't exist

def compare(src, dest):
    """
    Compare two files.

    Arguments
        src: Path of the source file.
        dest: Path of the destination file.

    Returns:
        Cmp enum
    """
    xsrc, xdest = os.path.exists(src), os.path.exists(dest)
    if not xsrc:
        return Cmp.nosrc
    if not xdest:
        return Cmp.nodest
    with open(src, 'rb') as s:
        csrc = sha256(s.read()).digest()
    if xdest:
        with open(dest, 'rb') as d:
            cdest = sha256(d.read()).digest()
    else:
        cdest = b''
    if csrc == cdest:
        return Cmp.same
    return Cmp.differ

因此,如果您现在尝试使用它,它看起来像这样;

res = compare(file_a, file_b)
if res == Cmp.same or res == Cmp.nosrc:
    pass
elif res == Cmp.differ:
    # copy file_a to file_b

您可以在不参考compare的文档的情况下理解这一点。您可能甚至不必查看Cmp枚举的具体内容。