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

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


当前回答

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

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

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

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

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

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

其他回答

JavaScript中的变量赋值可以创建全局变量。如果一个变量在函数中被赋值,并且没有在相同的作用域中声明为var,那么它将隐式声明为global。

function foo() {
  x = "juhu";  // creates a global variable x!
  var y = "kinners"
}

foo();
alert(x); // alerts "juhu"
alert(y); // alerts undefined

注意,var语句也可以在给变量赋值后使用:

function foo() {
  x = 12;
  var x; // x is now local
  return x;
}

alert(foo()); // will alert 12;
alert(x); // will alert undefined

VB的设计者。NET做了一些非常愚蠢的事情来保持与Visual Basic 6.0的向后兼容性。当然,还不足以让它实际上是兼容的,只是足以让事情变得更加反直觉。但最糟糕的是,你不需要初始化变量,因为它们已经初始化了,除非在极少数情况下它们没有初始化。

    For i As Integer = 1 To 3
        Try
            Dim k As Integer
            k += 1
            MsgBox(k)
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    Next

这将输出1 2 3。

拥有一个你不能100%信任的功能不是一个功能,它是一个bug。说它是设计出来的,只会让它成为一个设计错误,而不是实现错误。

2000年Perl Journal's obfusated Perl Contest的最佳参赛作品:

#:: ::-| ::-| .-. :||-:: 0-| .-| ::||-| .:|-. :||
open(Q,$0);while(<Q>){if(/^#(.*)$/){for(split('-',$1)){$q=0;for(split){s/\|
/:.:/xg;s/:/../g;$Q=$_?length:$_;$q+=$q?$Q:$Q*20;}print chr($q);}}}print"\n";
#.: ::||-| .||-| :|||-| ::||-| ||-:: :|||-| .:|

代码由作者在http://mysite.verizon.net/les.peters/id2.html详细解释

下面是Perl调试器中的一些混乱:

  DB<1> sub foo { +(1..20) } 
  DB<2> @bar = foo(); # list of 1, 2, 3, 4...20
  DB<3> x scalar @bar # size of list
0  20
  DB<4> x scalar foo();
0  ''

这是正确的。当您像这样调用方法时,标量上下文从标量向下传播到子例程调用,将看起来无害的..变成一个完全不同的运营商。(这是“触发器”操作符,而不是范围操作符)。

对于那些不知道的人来说,PostScript实际上是一种编程语言。我已经有点疯狂了——我写了一个PostScript程序,计算曼德尔布罗特分形的细节非常高。它真的是可打印的PostScript,尽管它会崩溃很多打印驱动程序…

总之,从哪里开始PostScript…这里有一个例子:您实际上可以创建一个标识符为....的变量什么都没有。

() cvn 5 def %将数字5分配给…没有什么

PostScript是一种基于堆栈的语言。()将一个空字符串放入堆栈。cvn将其转换为一个名称(如果打印它,则为“/”,因为PS中的所有名称前面都有斜杠)。然后5def将值5赋给它。(%是注释字符)

你不能直接把它拿回来,例如,如果我说“/ print”,这将不会打印数字5。但你可以间接地把它拿回来:

() CVN负载打印%这将打印数字5

还有什么……PostScript将字典作为原生类型,您可以使用数组引用作为字典的键…但是REFERENCE才是键,而不是数组。所以:

/myDict 100 dict def

[0] dup myDict exch 42 put myDict exch get == %打印42

myDict [1] 42 put myDict [1] get %抛出未定义错误

编辑:哦,是的,还有一件有趣的事情……在Ghostscript提示下尝试以下操作:

1 array dup dup 0 exch put ==

分析!