为什么以下有效?
#!/usr/bin/python
def spam():
pass
spam
我知道函数是对象,但我认为像上面这样的代码从来没有用过,而且总是错误的结果。为什么它不会导致引用垃圾邮件函数对象的行出现错误?
为什么以下有效?
#!/usr/bin/python
def spam():
pass
spam
我知道函数是对象,但我认为像上面这样的代码从来没有用过,而且总是错误的结果。为什么它不会导致引用垃圾邮件函数对象的行出现错误?
每个表达式都是有效的语句。使用局部变量(不管它指的是什么)是一个有效的表达式。由于后期绑定和动态性,您无法在编译时检测它是否引用了函数或其他内容(尽管在这种情况下您不需要知道这一点,因为仅引用本地永远不会做任何事情)。运行时检查将非常昂贵,而且没有任何收益。
剩下的就是禁止语句的形式<local variable>;
。明确禁止这种情况是不一致的,需要额外的工作,并且对恕我直言没有太大帮助。我看不出它无法完成的技术原因,所以它可能归结为 BDFL 不想要一个特殊情况。
首先,spam
当然spam()
是根本不同的说法。如果您查看 和 之间的区别,这一点就会变得很a = spam
清楚a = spam()
。第一个将函数存储在 variablea
中,第二个存储在那个时刻发生的一次函数调用的返回值。两者都很有用,但操作不同。
只是提到像 in 这样的功能spam
并没有做有用的事情,不。但是在 python 中,仅仅声明值是不被禁止的。根据您的论证,单个语句4
也应该是非法的,任何文字值也是如此。这实际上会禁止在任何地方使用 pydoc 字符串,因为它们只是提到了其他无用的值(从执行的角度来看)。
所以我认为可以禁止使用这样的裸值,但事实并非如此,现在它甚至有使用。
在一般情况下,引用裸表达式可能会产生副作用。编码:
class Nugget(object):
@property
def spam(self):
print "does merely referencing a property invoke it?"
n = Nugget()
n.spam # no explicit invocation
实际上打印消息。在您的示例案例中给您一个错误会破坏这种案例的一般性。