函数在python中使用之前是否应该定义?
在使用之前是否应该定义这些函数?但为什么以下代码有效:函数在python中使用之前是否应该定义?,python,function,Python,Function,在使用之前是否应该定义这些函数?但为什么以下代码有效: def main(): dog() def dog(): print("This is a dog.") if __name__ == '__main__': main() 我的意思是dog()是在被调用后定义的,它是如何工作的?名称dog被查找为全局名称。在实际使用全局变量之前,对全局变量的引用不需要引用任何已定义的内容。函数main()在被调用之前不会使用dog 如果未定义dog,调用main()将导致na
def main():
dog()
def dog():
print("This is a dog.")
if __name__ == '__main__':
main()
我的意思是dog()是在被调用后定义的,它是如何工作的?名称
dog
被查找为全局名称。在实际使用全局变量之前,对全局变量的引用不需要引用任何已定义的内容。函数main()
在被调用之前不会使用dog
如果未定义dog
,调用main()
将导致namererror
异常:
>>> def main():
... return dog()
...
>>> main()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in main
NameError: global name 'dog' is not defined
>>> def dog():
... return 'Woof!'
...
>>> main()
'Woof!'
因为在上一个示例中,
dog
现在绑定到一个字符串,所以当尝试调用它时,main
函数失败。名称dog
被查找为全局变量。在实际使用全局变量之前,对全局变量的引用不需要引用任何已定义的内容。函数main()
在被调用之前不会使用dog
如果未定义dog
,调用main()
将导致namererror
异常:
>>> def main():
... return dog()
...
>>> main()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in main
NameError: global name 'dog' is not defined
>>> def dog():
... return 'Woof!'
...
>>> main()
'Woof!'
因为在上一个示例中,dog
现在绑定到一个字符串,所以当尝试调用它时,main
函数失败。实际上它不是(在调用之后定义的)。此脚本将执行以下操作:
- 创建函数并将其分配给“main”
- 创建函数并将其分配给“dog”
- 呼叫“主”
dog
在全局范围内是已知的,并且main
可以调用它。实际上它不是(在调用之后定义)。此脚本将执行以下操作:
- 创建函数并将其分配给“main”
- 创建函数并将其分配给“dog”
- 呼叫“主”
此时,
dog
在全局范围内已经是已知的,并且main
可以调用它。函数块/方法中的代码在调用函数之前不会执行。而且CPython语言实现(这是最常见的一种,您可能正在使用的实现)在编译时不会像C这样进行名称检查。因为它主要是一种解释语言,所以它会在运行时动态检查名称空间中的名称是否可用
此外,关于Python您应该知道的是,类中的代码在创建类时执行,而方法/函数中的代码则不执行。def
语句只是将函数名添加到名称空间中。在调用函数之前,它不会在函数本身中运行任何代码
考虑以下合法的Python代码
class Something:
def __init__(self):
self.puppy = Dog()
class Dog:
def __init__(self):
pass
inst = Something()
这是完全合法的,因为在定义Dog
类之前,不会运行\uuuu init\uuu
。但是如果我们把构造函数移到创建类Dog的上面呢
这段代码会抱怨NameError,因为Dog还没有定义
class Something:
def __init__(self):
self.puppy = Dog()
inst = Something()
class Dog:
def __init__(self):
pass
最后一个例子
此代码将抱怨相同的名称错误
class Something:
my_puppy = Dog()
def __init__(self):
self.puppy = Dog()
class Dog:
def __init__(self):
pass
inst = Something()
这是因为
Something
中的所有代码都会立即执行,在执行过程中,命名空间/作用域无权访问名称Dog
函数块/方法中的代码不会在调用函数之前执行。而且CPython语言实现(这是最常见的一种,您可能正在使用的实现)在编译时不会像C这样进行名称检查。因为它主要是一种解释语言,所以它会在运行时动态检查名称空间中的名称是否可用
此外,关于Python您应该知道的是,类中的代码在创建类时执行,而方法/函数中的代码则不执行。def
语句只是将函数名添加到名称空间中。在调用函数之前,它不会在函数本身中运行任何代码
考虑以下合法的Python代码
class Something:
def __init__(self):
self.puppy = Dog()
class Dog:
def __init__(self):
pass
inst = Something()
这是完全合法的,因为在定义Dog
类之前,不会运行\uuuu init\uuu
。但是如果我们把构造函数移到创建类Dog的上面呢
这段代码会抱怨NameError,因为Dog还没有定义
class Something:
def __init__(self):
self.puppy = Dog()
inst = Something()
class Dog:
def __init__(self):
pass
最后一个例子
此代码将抱怨相同的名称错误
class Something:
my_puppy = Dog()
def __init__(self):
self.puppy = Dog()
class Dog:
def __init__(self):
pass
inst = Something()
这是因为
Something
中的所有代码都会立即执行,并且在执行过程中,命名空间/作用域无法访问名称Dog
,可能是因为Dog
函数位于此脚本的命名空间中。可能是因为Dog
函数位于此脚本的命名空间中。