在Python中,常量比变量占用更多内存吗?

在Python中,常量比变量占用更多内存吗?,python,python-3.x,Python,Python 3.x,有人告诉我用变量替换代码中常用的常量。例如: if a > 50: 比如: b = 50 if a > b: 考虑到在我的代码中经常使用数字50(例如用于类似的比较)。那么这到底是如何更好呢?用于此目的的变量是否对内存更友好,还是仅仅为了编码风格?我使用的是Python3.4,一般来说,幻数被认为是不好的风格。当我阅读您的代码时,可能不清楚“50”是什么意思。分钟?美元?这就是为什么你要做像MAX_MINUTES=50这样的事情。这取决于代码,这可能对其他人了解那里发生了什么非常

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

if a > 50:
比如:

b = 50
if a > b:

考虑到在我的代码中经常使用数字50(例如用于类似的比较)。那么这到底是如何更好呢?用于此目的的变量是否对内存更友好,还是仅仅为了编码风格?我使用的是Python3.4,一般来说,幻数被认为是不好的风格。当我阅读您的代码时,可能不清楚“50”是什么意思。分钟?美元?这就是为什么你要做像MAX_MINUTES=50这样的事情。这取决于代码,这可能对其他人了解那里发生了什么非常有帮助

一般来说,幻数被认为是不好的风格。当我阅读您的代码时,可能不清楚“50”是什么意思。分钟?美元?这就是为什么你要做像MAX_MINUTES=50这样的事情。这取决于代码,这可能对其他人了解那里发生了什么非常有帮助

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

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

常数的概念是,你只需要在一个中心位置调整这些数字。例如,您可以有一个
constants.py
模块,该模块在一个中心位置声明所有重要的常量,并且您只能执行一个检查
a>常量。一些\u阈值
。在这种情况下,当需求更改时,您只需要在单个位置更改常量值,而不需要查找使用该常量的所有位置

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

拥有常量变量还可以使这些常量获得实际名称。
50
可以代表任何东西;但是如果有一个变量名,你可以给它一个描述其含义的名称

当然,拥有这样集中的常量并不是对所有事情都有意义。您应该根据具体情况决定哪些常量值适合提取为常量变量,哪些不适合


当然,就内存而言,在某个时刻声明变量需要将该变量存储在某个地方。但是变量非常便宜,所以这并不重要。不管怎样,这个值很可能会被循环使用:对于小整数,Python甚至会保留实际的常量整数对象作为缓存。

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

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

常数的概念是,你只需要在一个中心位置调整这些数字。例如,您可以有一个
constants.py
模块,该模块在一个中心位置声明所有重要的常量,并且您只能执行一个检查
a>常量。一些\u阈值
。在这种情况下,当需求更改时,您只需要在单个位置更改常量值,而不需要查找使用该常量的所有位置

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

拥有常量变量还可以使这些常量获得实际名称。
50
可以代表任何东西;但是如果有一个变量名,你可以给它一个描述其含义的名称

当然,拥有这样集中的常量并不是对所有事情都有意义。您应该根据具体情况决定哪些常量值适合提取为常量变量,哪些不适合


当然,就内存而言,在某个时刻声明变量需要将该变量存储在某个地方。但是变量非常便宜,所以这并不重要。不管怎样,这个值很可能会被循环使用:对于小整数,Python甚至会保留实际的常量整数对象作为缓存。

因为您使用的是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
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