当前位置: 网站首页>小程序开发>网络推广

高端!网站定制/设计/优化/二次开发/制作/搭建-佛山高端网站建设

发表日期: 2022-07-04 14:12:38 浏览次数:25

高端!网站定制/设计/优化/二次开发/制作/搭建-佛山高端网站建设

网站建设.png

错误信息为局部作用域引用错误,因为 test 函数中的 a 使用的是局部,未定义,无法修改。

修改 a 为全局变量:

实例

#!/usr/bin/python3 a = 10def test():    global a    a = a + 1    print(a)test()

执行输出结果为:

11

也可以通过函数参数传递:

实例(Python 3.0+)

#!/usr/bin/python3 a = 10def test(a):    a = a + 1    print(a)test(a)

执行输出结果为:

11



过函数参数传递:


实例(Python 3.0+)

#!/usr/bin/python3

 

a = 10

def test(a):

    a = a + 1

    print(a)

test(a)

执行输出结果为:


11

 Python3 面向对象Python3 标准库概览 

4 篇笔记 写笔记

   alibi


  ali***jia@qq.com


316

作为一个从 Java 过来的人来说,Python 的作用域有点奇葩,作为开发者,只需要关注全局作用域和局部作用域就好了,全局作用域就是说白了模块(单个 .py 文件中)直接声明的变量。


比如有个 demo.py 的文件,含有以下代码:


var_global='global_var'#这个var_global就是全局作用域

def globalFunc():

  var_local='local_var' #这个就是局部变量

class demo():

  class_demo_local_var='class member' #这里也是局部变量

  def localFunc(self):

    var_locals='local_func_var'#这里也是局部变量

以上只是说明了全局变量仅仅是在 .py 文件中直接声明的变量叫全局变量,还有在 .py 文件中直接写的逻辑代码块中,也是全局变量。也就是说在 if/elif/else/、try/except、for/while 等逻辑代码块中的变量。


这个教程中在介绍三种命令空间的时候,说查找变量的顺序为局部的命名空间去 -> 全局命名空间 -> 内置命名空间,但是我理解的变量查找顺序为:当前域 -> 外部域(如果有) -> 全局域 -> 内置域。


光说没有什么概念,我们来一段代码就清楚了。


我们以 demo1.py 为例子:


global_var='this  var  on  global space' 

'''

申明global_var这个位置就是全局域,也就是教程中所说的全局作用域,

同时它也是直接声明在文件中的,而不是声明在函数中或者类中的变量

'''

class demo():

  class_demo_local_var='class member' 

  '''

  虽然class_demo_local_var在这里是局部变量,这个局部变量的域相对于var_locals是外部域,

  所以可以直接被var_locals所在的更小的局部域访问

  '''

  def localFunc(self):

    var_locals='local_func_var'

    '''

    这里也是局部变量,但是相对于class_demo_local_var变量,却是更小的域,

    因此class_demo_local_var所在的哪个域无法访问到当前域来

    '''

    print(self.class_demo_local_var)#到这里会查找当前域中有没有class_demo_local_var这个变量,然后再到相对于当前域的外部域去查找变量

alibi

   alibi


  ali***jia@qq.com


3年前 (2019-10-20)

   tempo


  luo***7@iccas.ac.cn


183

教程中写到 Python 中变量的查找顺序:“在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再去内置中找。可以看一个具体的例子。


Python 的一个内建值 int,我们首先将其赋值为 0,然后定义一个函数 fun1()。


int = 0

def fun1():

    int = 1

    def fun2():

        int = 2

        print(int)

    fun2()

fun1()  # 输出 2

函数 fun1() 的作用就是调用函数 fun2() 来打印 int 的值。


输出结果为:2


因为 local 中的 int = 2,函数将其打印出来。


将函数 fun2() 中的 int = 2 删除:


int = 0

def fun1():

    int = 1

    def fun2():

        print(int)

    fun2()

fun1()  # 输出 1

调用函数 fun1() 输出结果为:1


因为 local 找不到 int 的值,就去上一层 non-local 寻找,发现 int = 1 并打印。


而进一步删除函数 fun1() 中的 int = 1:


int = 0

def fun1():

    def fun2():

        print(int)

    fun2()

fun1() # 输出 0

调用函数 fun1() 输出结果为:0


因为 local 和 non-local 都找不到 int 的值,便去 global 中寻找,发现 int = 0 并打印。


若删除 int = 0这一条件:


def fun1():

    def fun2():

        print(int)

    fun2()

fun1()

调用函数 fun1() 输出结果如下:


<class 'int'>

因为 local、non-local、global 中都没有 int 的值,便去 built-in 中寻找 int 的值,即:


>>> int

<class 'int'>

tempo

   tempo


  luo***7@iccas.ac.cn


3年前 (2019-12-16)

   GsxxInRnb


  993***819@qq.com


   参考地址


19

若没有使用 global 或 nonlocal 关键字对局部变量进行声明,在局部作用域中,可以访问全局命名空间中的变量,不可对其进行赋值。


对于教程中的这个实例:


a = 10

def test():

    a = a + 1

    print(a)

test()

运行后如下:(提示出错)


Traceback (most recent call last):

  File "<input>", line 5, in <module>

  File "<input>", line 3, in test

UnboundLocalError: local variable 'a' referenced before assignment

若程序改为如下:


a = 10

def test():    

    b = a + 1    

    print(b)

test()

运行结果:(正常运行)


11

在函数 test() 中,可以读取全局命名空间中的 “a”,对应语句 “b=a+1”。


即在局部作用域中,可以访问全局命名空间中的变量。


若程序改为如下:


a = 10

def test():    

    b = a + 1    

    a=b    

    print(b)

test()

运行:(提示出错)


Traceback (most recent call last):

  File "<input>", line 6, in <module>

  File "<input>", line 3, in test

UnboundLocalError: local variable 'a' referenced before assignment

错误的原因在于语句 “a=b”,对 “a” 进行赋值是不可以的。


即在函数 test() 中,不可以直接对全局命名空间中的 “a” 进行赋值。


若程序改为如下:


a = 10

def test():

    global a

    b = a + 1    

    a=b

    print(b)

test() #输出b

print(a) #输出a

运行:(正常运行)


11

11

语句 “global a” 声明了 “a” 采用全局命名空间中的 “a”,这样便可在


高端!网站定制/设计/优化/二次开发/制作/搭建-佛山高端网站建设

400-111-6878
服务热线
顶部

备案号: 苏ICP备11067224号

CopyRight © 2011 书生商友信息科技 All Right Reserved

24小时服务热线:400-111-6878   E-MAIL:1120768800@qq.com   QQ:1120768800

  网址: https://www.768800.com  网站建设上往建站

关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|

企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|

400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 昌平殡葬| 朝阳殡葬|

预约专家

欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系

  

服务热线:400-111-6878