在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