【问题标题】:do any computer languages know the difference between checking for variable that doesn't exist, and checking for existence? [closed]是否有任何计算机语言知道检查不存在的变量和检查是否存在之间的区别? [关闭]
【发布时间】:2016-01-14 16:55:26
【问题描述】:

我觉得在 python 中很奇怪的一点是无法做到:

In [3]: if x:
   ...:     print y
   ...:     

----> 1 if x:
      2     print y
      3 

NameError: name 'x' is not defined

这导致将事物声明为 None 或诸如此类,或者使用 try/except 在这两种情况下都是更多代码。我的朋友曾经说过“你不想检查不存在的东西”,我不同意,因为你可以检查该项目是否存在,而不是现有项目是否有任何东西。一个从未存在过的虚构人物和一个现在还没有活着的死者之间是有区别的。

是否有任何语言允许这样做,它是否强大,或者会导致问题?

【问题讨论】:

  • 这将被认为是任何语言的反模式,即使是允许它的语言......如果这就是你想要做的,还有其他机制来测试存在......但你通常只想检查value ... 如果您这样做了,您将无法判断您是因为变量不存在而没有输入 if 语句,还是由于变量为“falsey”而没有输入 if 语句

标签: python functional-programming computer-science


【解决方案1】:

当您是新手时,这似乎是个好主意,但几乎总是无用的,例如在您应该使用列表时创建编号为 item1itemN 的变量。你可以做到:

try:
    x
except NameError:
    defined = False
else:
    defined = True

但通常有更好的方法来实现您的基本目标。

【讨论】:

    【解决方案2】:

    Tcl 允许您检查变量是否存在:

    if {[info exists some_variable]} {
        puts "it exists"
    } else {
        puts "it does NOT exist"
    }
    

    我不确定我是否会将其描述为“强大”本身,但它在某些情况下很有用。

    【讨论】:

      【解决方案3】:

      任何强类型语言都有这个,因为如果x不存在,程序将无法编译

      【讨论】:

        【解决方案4】:

        Javascript 支持 - 它被称为 undefined

        虽然变量仍然可以用 undefined 来定义。看来,至少在 Javascript 中,确实有一些 weird problems 是您可以面对的,但这可能不是由于未定义的性质,而是更多是因为您可以重新定义 undefined

        【讨论】:

        • 这可能是这家伙指的。他一般不喜欢javascript
        【解决方案5】:

        Python 有这个:你可以使用locals().get("foo") 来查看“foo”是否存在于本地范围内。 globals() 相同。如果它是一个属性,您可以使用getattr(o,"foo") 来查看o 是否具有属性foo

        【讨论】:

          【解决方案6】:

          你区分声明和初始化吗?例如,在 Perl 中:

          use strict;
          my $var1;
          

          变量$var1 是逻辑声明的,但if (defined $var1) 测试将返回false,因为它的值是undef,即未初始化变量的Perl 值。 use strict 不会抛出编译错误,但如果我们使用 $var2 代替它会。

          在 Python 中,没有正式的方式来声明变量,所有变量,如果没有另外分配,都是对 None 对象的引用。请注意,它们是参考。在日常用语中,人们常说它们有 None,但这并不完全正确。

          所以在 Python 中正确的测试是 is:

          if x is None:
              ...
          

          我们正在测试x 是否是对None 的引用,因为在 Python 中没有初始化变量之类的东西。所以这会导致将事物声明为无,您不需要显式分配None(尽管它可以提高可读性)。

          当然None如果经常用于其他目的,例如作为返回值来指示错误。

          Ruby 有一个与None 类似的概念,称为nil。但是分配规则有点复杂。

          【讨论】:

            猜你喜欢
            • 2014-09-08
            • 2011-12-16
            • 1970-01-01
            • 2010-10-25
            • 2016-12-28
            • 2021-07-23
            • 1970-01-01
            • 2016-05-25
            相关资源
            最近更新 更多