任何计算机语言都知道检查不存在的变量和检查存在之间的区别吗?

时间:2016-01-14 16:55:27

标签: python functional-programming computer-science

在python中我觉得奇怪的是无法做到的事情:

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

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

NameError: name 'x' is not defined

这导致将事物声明为None或诸如此类,或使用try / except,在这两种情况下都是更多代码。我的朋友说过一次"你不想检查那些不存在的东西",我不同意,因为你可以检查项目是否存在与现有项目相比有什么。一个从未存在过的虚构角色和一个现在还不活着的死者之间存在差异。

是否允许使用任何语言并且功能强大或导致问题?

6 个答案:

答案 0 :(得分:3)

当你应该使用列表时,这是一个好主意的事情之一,当你是新的但几乎总是没用时,比如创建编号为item1itemN的变量。你可以这样做:

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

Javascript确实 - 它被称为undefined

虽然仍然可以使用undefined定义变量。看起来,在Javascript中,至少,你可以面对一些真正的weird problems,但由于未定义的性质可能更少,因为你可以重新定义{{1 }}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

您是否区分申报和初始化?例如,在Perl中:

use strict;
my $var1;

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

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

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

if x is None:
    ...

我们正在测试x是否是对None的引用,因为在Python中没有初始变量这样的东西。所以这导致将事物声明为无,您不需要明确指定None(尽管它有助于提高可读性)。

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

Ruby与None的概念类似nil。但是,分配规则稍微复杂一些。