美文网首页python知识点
python-命名空间、作用域,和局部函数

python-命名空间、作用域,和局部函数

作者: python_run | 来源:发表于2019-03-31 22:09 被阅读0次

命名空间

Python中变量的使用有作用域的问题,即命名空间(namespace)。任何在函数中 赋值的变量 默认都是被分配到局部命名空间(local namespace)中的。
(千万注意此处赋值的变量这个描述,即在进行赋值的时候,接下来介绍的内容在python解释器中会发生作用)........
局部命名空间是在函数被调用时创建的,函数参数会立即填入该命名空间。在函数执行完毕之后,局部命名空间就会被销毁

命名空间作用时机

首先介绍命名空间发生作用的两个特点:
1.python解释器对于一个进行赋值的变量的访问顺序是局部命名空间,嵌套命名空间,全局命名空间,内置命名空间(即会按照这个顺序访问一个变量)
2.在内存中实际的作用机制是:变量名称实际上保存的是对象的内存地址,即指向对象;而对象则真正保存了对象可以使用的属性,方法等,如下图


图片.png

命名空间的坑:

1.局部空间和全局空间使用了相同的变量名,这会导致,python解释器首先从局部空间查找该变量,而由于在局部空间这是新创建的变量,其指向对象的值为none,所以往往会发生错误,


图片.png

如以下这个比较经典的例子:

a = 0
def func():
  a+=1
UnboundLocalError: local variable 'a' referenced before assignment

2.如果真的想要想要在局部空间里使用和全局空间里相同的变量名,如对全局变量进行自增操作,则可以使用global 变量名 来表示该变量。->其工作原理就是,直接从全局空间里查找该变量,不按照常规套路从局部空间里查找该变量。


图片.png
a = 0
def func():
    global a
    a+=1
    print('局部:',a)
func()
print('全局:',a)
输出结果:
全局: 1
局部: 1

3.根据以上两点坑的介绍,大概明白了机制,本质上就是变量命名与对象之间的指向问题,所以只要把指向问题的坑避免了就可以避免程序bug,
另外需要注意的是,虽然存在指向的问题,但是保存的对象的方法还是可以正常使用的,所以如果需要大量使用global,则最好别大量使用,定义一个类,将属性,方法保存在类中,用对象进行访问。

相关文章

  • 作用域

    标识符的作用域有函数原型作用域、局部作用域(块作用域)、类作用域和 命名空间(namespace) 作用域 函数原...

  • 2021-12-10 Python-13

    自建函数 1.命名空间、作用域和本地函数Python 变量有全局和局部两种作用范围。命名空间就是用来描述变量的作用...

  • python-命名空间、作用域,和局部函数

    命名空间 Python中变量的使用有作用域的问题,即命名空间(namespace)。任何在函数中 赋值...

  • golang作用域总结

    作用域分为全局作用域、包级作用域和局部作用域 系统内置的类型、函数和常量属于全局作用域 命名函数只能在包级作用域中...

  • python-命名空间和作用域

    前言 前段时间写脚本的时候,在调用函数的时候,一直在想在python中函数的参数是传值还是传引用?先看一下下面两个...

  • JavaScript基础语法之函数的作用域

    函数的作用域 ​ 函数作用域:全局 (global variable) 和 局部 (local variable)...

  • JS高级知识点汇总

    1.作用域 局部作用域:函数内部就是局部作用域。 ①在局部作用域申明的变量称为局部变量,局部变量只能在当前函数内部...

  • python基础教程:作用域和命名空间

    命名空间和作用域的概念我们之前也提到过,比如内置函数globals(),函数中变量的作用域,模块使用的import...

  • python——作用域和给对象及类添加属性和方法

    作用域 命名空间 变量或函数生效的范围 globals、locals LEGB规则locals(当前命名空间) ...

  • js作用域

    1 - 作用域 1.1 作用域概述 全局作用域 局部作用域(函数作用域) 1.2 全局作用域 1.3 局部作用域 ...

网友评论

    本文标题:python-命名空间、作用域,和局部函数

    本文链接:https://www.haomeiwen.com/subject/urqpbqtx.html