python系列教程182

74 阅读3分钟

朋友们,如需转载请标明出处:blog.csdn.net/jiangjunsho…

声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!想要学习AI技术的同学可以点击跳转到我的教学网站。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!

我们可以运行dir调用来看看python预定义了哪些变量名:

>>>import builtins

>>>dir(builtins)

['ArithmeticError','AssertionError','AttributeError','BaseException',

'BufferError','BytesWarning','DeprecationWarning','EOFError','Ellipsis',

    ...many more names omitted...

'print','property','quit','range','repr','reversed','round','set',

'setattr','slice','sorted','staticmethod','str','sum','super','tuple',

'type','vars','zip']

这个列表中的变量名组成了Python中的内置作用域。概括地讲,前一半是内置的异常,而后一半是内置函数。由于LEGB法则Python最后将自动搜索这个模块,将会自动得到这个列表中的所有变量名。也就是说,你能够使用这些变量名而不需要导入任何模块。因此,有两种方法引用一个内置函数:通过LEBG法则,或者手动导入__builtin__模块。

>>>zip                # The normal way

<class 'zip'>

>>>import builtins    # The hard way

>>>builtins.zip

<class 'zip'>

其中的第二种实现方法有时在复杂的任务中是很有用的。细心的读者也许注意到了由于LEGB查找的流程,会使它在找到第一处变量名的地方生效。也就是说,在本地作用域的变量名可能会覆盖在全局作用域和内置作用域中有着相同变量名的变量,而全局变量名有可能覆盖内置的变量名。举个例子,一个函数创建了一个名为open的本地变量并将其进行了赋值:

def hider():

    open = 'spam'        # Local variable,hides built-in

    ...

    open'data.txt'# This won't open a file now in this scope!

这样的话,就会将内置作用域的名为open的内置函数隐藏起来。这也往往是个Bug,并且让人头疼的是,因为Python对于这个问题并不会处理为警告消息(因为在高级编程的场合你可能会很想通过在代码中预定义变量名来替代内置的变量名)。

函数也能够简单地使用本地变量名隐藏同名的全局变量。

X = 88          # Global X




def func():

    X = 99      # Local X: hides global




func()

print(X)        # Prints 88: unchanged

这里,函数内部的赋值语句创建了一个本地变量X,它与函数外部模块文件的全局变量X是完全不同的变量。正是由于这一点,如果在def内不增加global(或nonlocal)声明的话,是没有办法在函数内改变函数外部的变量的。