在你看来,你遇到过的最令人惊讶、最怪异、最奇怪或最“WTF”的语言特性是什么?

请每个回答只回答一个特征。


当前回答

在Python中:

abs((10+5j)-(25+-5j))

返回~18.03,根据毕达哥拉斯定理,这是点(10,5)和(25,5)之间的距离。之所以会出现这种情况,是因为Python的原生语言支持2+2j形式的复数。由于复数的绝对值形式为a+bj =根号下(a^2+b^2),我们得到距离,同时从一个复数减去另一个复数,然后应用abs(绝对)函数在它上面。

其他回答

在PHP中,字符串和函数指针一样好:

$x = "foo";
function foo(){ echo "wtf"; }
$x(); # "wtf"

不幸的是,这并不管用:

"foo"();

在Python中,每个字符串都包含空字符串。

answer = input("Enter 'Y[es] or N[o]:")
if answer in 'YyNn':        # verify input
    process(answer) 

只要在上面的查询中点击return就会将答案设置为空字符串,将if答案传递给…测试,并被处理为正确答案。更简洁地说:

>>> "ABCDEFGHIJ".__contains__("")
True

像往常一样,Python在这里的行为在数学和逻辑上都是无可挑剔的。就像我在很久以前的集合论课上回忆的那样:空集合是每个集合的成员。

当我偶尔被它咬到的时候,它仍然让我感到惊讶,但我不会有其他的方式。

在PHP中,“true”,“false”和“null”是常量,通常不能被重写。但是,随着PHP >=5.3中名称空间的引入,现在可以在除全局名称空间之外的任何名称空间中重新定义这些常量。这可能导致以下行为:

namespace {
    define('test\true', 42);
    define('test\false', 42);
    define('test\null', 42);
}

namespace test {
    var_dump(true === false && false === null); // is (bool) true
}

当然,如果希望真值为真,总是可以从全局名称空间导入真值

namespace test {
    var_dump(\true === \false); // is (bool) false
}

我一直是PHP错误的忠实粉丝,当在一行中使用两个冒号时脱离上下文:

解析错误:语法错误,第3行/path/to/file/error.php中的T_PAAMAYIM_NEKUDOTAYIM异常

第一次遇到这种情况时,我完全被弄糊涂了。

我想说的是,Python的空白是我最棒的WTF特性。的确,你或多或少会在一段时间后习惯它,而且现代编辑器使它更容易处理,但即使在过去一年里我几乎全职从事python开发,我仍然相信这是一个坏主意。我已经阅读了所有背后的原因,但说实话,它妨碍了我的工作效率。差不了太多,但鞍下还是有毛刺。

编辑:从评论来看,有些人似乎认为我不喜欢缩进我的代码。这是一个不正确的评估。无论使用什么语言,无论是否被迫,我总是将代码缩进。我不喜欢的是,缩进定义了一行代码所在的块。我更喜欢使用显式分隔符。除其他原因外,我发现显式分隔符更容易剪切和粘贴代码。

例如,如果我有一个缩进4个空格的块,并将它粘贴到一个缩进8个空格的块的末尾,我的编辑器(所有编辑器?)不知道粘贴的代码是属于8个空格的块还是外部块。OTOH,如果我有显式分隔符,很明显,代码属于哪个块以及它应该如何(重新)缩进——它通过智能地寻找块分隔符来做到这一点。

编辑2:一些提供评论的人似乎认为这是一个我讨厌的功能,或者我认为这使得python成为一种糟糕的语言。同样,这不是真的。虽然我不太喜欢它,但这不是重点。这个问题是关于最奇怪的语言特征,我认为这很奇怪,因为它是非常非常少(但是>0)语言使用的东西。