在C / C ++中使用以下代码,例如:
int foo[] = {0, 0, 0, 0};
没有神奇的数字,对吧? 现在,Python的“等效”将是:
foo = [0, 0, 0, 0]
仍然没有神奇的数字 但是,在Python中,同样的事情可以写成:
foo = [0] * 4
现在我们有一个神奇的数字。或者我们呢? 我猜这个和其他类似的东西都存在于这些和其他语言中。
答案 0 :(得分:11)
并非每个号码都是magic constant。 4
和四个0
是神奇数字(在任何语言中)的原因是它完全不清楚为什么该数字是4
而不是任何其他数字。
例如,在使用众所周知的六面骰子玩游戏的背景下
def roll_die():
return random.randint(1,6)
这段代码没有神奇的数字,因为很容易看到数字的来源。
另一方面,很难猜出其他程序员知道哪些数字。例如,并非所有人都知道牌组中的牌数,因此在那里使用命名常量更有意义。
如果数字是“魔法”,它完全取决于上下文,它与语言无关。如有疑问,请将您的常量命名为安全。
答案 1 :(得分:5)
与(在C或C ++中)有何不同:
int foo[4] = {0};
在所有这些情况下,数组的大小都是一个神奇的数字。
答案 2 :(得分:0)
按照我理解的方式,幻数是域值(用于计算,映射元素中的索引)。它们的概念在任何语言中都是一致的。在您的示例中,它取决于这些数组的用途。
答案 3 :(得分:0)
请参阅以下代码。这是一种c语言功能。
int arr[] = { [0 ... 4]=3,[7]=7,[8 ... 12]=12,[15]=0};
与
相同int arr [] = {3,3,3,3,3,0,0,7,12,12,12,12,12,0,0,0};
答案 4 :(得分:-1)
你所有的问题都表明,“魔法数字”的概念和反对在你的程序中使用“魔法数字”的规则是完全和完全愚蠢的。对于魔法数字的规则是不好的近似,由不理解他们正在做什么的人,在多个地方硬编码的更加理智的规则必须达成一致或相互依赖的价值。例如,只要缓冲区长度不需要与程序或现实世界中的任何其他内容匹配,此代码就完全合理:
char buf[100];
snprintf(buf, sizeof buf, ...);
但是这段代码非常糟糕:
char buf[100];
snprintf(buf, 100, ...);
当然,在现实世界中, 可能需要缓冲区大小匹配,例如打印某个特定大小的整数所需的最大位数。在这种情况下,您可能需要以下内容:
char buf[3*sizeof(int)+3];
snprintf(buf, sizeof buf, ...);
如果您认为CHAR_BIT
是可变的,那么您可能希望使用CHAR_BIT
方面的公式替换3。在任何情况下,表达式中出现的常数都不是“邪恶的魔法数字”。
在您的示例中,如果数组的维度依赖于某个其他变量,那么您的所有三个数组定义都是不好的做法。但是如果维度4对于你正在做的事情是至关重要的,我认为它没有任何问题。
当然,您所做的事情有时会在代码的生命周期中发生变化,但这就是文档的用途。如果没有一定程度的修改,代码就不能指望未来可能的目的改变,并且只要你记录了它的最初目的和合同是什么,那么改变它们的人就不应该很难找到代码的各个部分。需要改变。