Python程序中创建、改变、查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域.

全局作用域(global):即在模块层次中定义的变量,每一个模块都是一个全局作用域。也就是说,在模块文件顶层声明的变量具有全局作用域,从外部开来,模块的全局变量就是一个模块对象的属性。

全局变量可以在函数内部访问,不能修改,修改想要修改可以用globa来装饰变量

注意:全局作用域的作用范围仅限于单个模块文件内.

  1. >>> x = 1 #定义一个变量
  2. >>> def fun():
  3. y=3
  4. print (x,y) #定义一个函数,这个函数会调用变量x
  5.  
  6. >>> fun() #调用函数
  7. 1 3
  8. >>> def fun():
  9. y=3
  10. x+=1 #这个函数会修改变量x
  11. print (x,y)
  12.  
  13. >>> fun() #此时调用函数时就会报错。
  14. Traceback (most recent call last):
  15. File "<pyshell#85>", line 1, in <module>
  16. fun()
  17. File "<pyshell#84>", line 3, in fun
  18. x+=1
  19. UnboundLocalError: local variable 'x' referenced before assignment
  20. >>> def fun():
  21. y=3
  22. global x #声明这个 x 变量为全局变量,相当于授权。
  23. x+=1 #这个函数会修改变量x
  24. print (x,y)
  25.  
  26. >>> fun() #成功调用函数
  27. 2 3
  28. >>>
  1. >>> y #函数中的y是无法访问的,因为y是局部变量
  2. Traceback (most recent call last):
  3. File "<pyshell#89>", line 1, in <module>
  4. y
  5. NameError: name 'y' is not defined
  6. >>> def fun():
  7. global y #给局部变量y授权,类似出国签证。
  8. y=3
  9. global x
  10. x+=1
  11. print (x,y)
  12.  
  13. >>> fun() #调用函数
  14. 3 3
  15. >>> y #可以访问变量y
  16. 3
  17. >>>

nonlocal函数:当里层局部,需要修改外层局部变量时,需要使用nonlocal。这个和全局变量不同,无法在函数体以外调用。

  1. >>> def fun(): #这个函数里面内嵌一个函数
  2. q =1
  3. print('局部变量:',q)
  4. def fun1():
  5. w=2
  6. print('内嵌函数局部外层变量:',q) #调用上一级函数的局部变量
  7. print('内嵌函数局部里层变量:',w)
  8. fun1() #执行函数fun()时会自动调用函数fun1()
  9.  
  10. >>> fun() #查看结果,调用函数fun()时会自动调用函数fun1()。
  11. 局部变量: 1
  12. 内嵌函数局部外层变量: 1
  13. 内嵌函数局部里层变量: 2
  14. >>> def fun():
  15. q =1
  16. print('局部变量:',q)
  17. def fun1():
  18. w=2
  19. q+=1 #调用上一级函数的局部变量q,并且修改这个 变量。
  20. print('内嵌函数局部外层变量:',q)
  21. print('内嵌函数局部里层变量:',w)
  22. fun1()
  23.  
  24. >>> fun() #因为此时局部变量q不能被内嵌函数调用,目前还没有没有授权
  25. 局部变量: 1
  26. Traceback (most recent call last):
  27. File "<pyshell#109>", line 1, in <module>
  28. fun()
  29. File "<pyshell#108>", line 9, in fun
  30. fun1()
  31. File "<pyshell#108>", line 6, in fun1
  32. q+=1
  33. UnboundLocalError: local variable 'q' referenced before assignment
  34. >>> def fun():
  35. q =1
  36. print('局部变量:',q)
  37. def fun1():
  38. w=2
  39. nonlocal q #使用nonlocal授权,允许内嵌函数fun1()可以调用变量q
  40. q+=1
  41. print('内嵌函数局部外层变量:',q)
  42. print('内嵌函数局部里层变量:',w)
  43. fun1()
  44.  
  45. >>> fun()
  46. 局部变量: 1
  47. 内嵌函数局部外层变量: 2
  48. 内嵌函数局部里层变量: 2
  49. >>>
  1. >>> q #因为这个局部变量q,只是在内嵌函数fun1()里面使用了nonlocal 进行了授权,所以在fun1()以外时无法调用的。
  2. Traceback (most recent call last):
  3. File "<pyshell#114>", line 1, in <module>
  4. q
  5. NameError: name 'q' is not defined

  

  

 

Python 函数内变量的作用域的更多相关文章

  1. Python中的变量和作用域详解

    Python中的变量和作用域详解 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部 ...

  2. JavaScript闭包理解【关键字:普通函数、变量访问作用域、闭包、解决获取元素标签索引】

        一.闭包(Closure)模糊概述 之前总觉得闭包(Closure)很抽象而且难理解,百度一下"闭包"名词,百度的解释是:“闭包是指可以包含自由(未绑定到特定对象)变量的代 ...

  3. python函数对变量的作用及遵循的原则

    1.全局变量和局部变量 全局变量:指在函数之外定义的变量,一般没有缩进,在程序执行的全过程有效 局部变量:指在函数内部使用的变量,仅在函数内部有效,当函数退出时变量将不存在 例如: n=1 #n是全局 ...

  4. Python入门笔记(22):Python函数(5):变量作用域与闭包

    一.全局变量与局部变量 一个模块中,最高级别的变量有全局作用域. 全局变量一个特征就是:除非被删除,否则他们存活到脚本运行结束,且对于所有的函数都可访问. 当搜索一个标识符(也称变量.名字等),Pyt ...

  5. python 函数及变量作用域及装饰器decorator @详解

    一.函数及变量的作用   在python程序中,函数都会创建一个新的作用域,又称为命名空间,当函数遇到变量时,Python就会到该函数的命名空间来寻找变量,因为Python一切都是对象,而在命名空间中 ...

  6. Python学习(21):Python函数(5):变量作用域与闭包

    转自 http://www.cnblogs.com/BeginMan/p/3179040.html 一.全局变量与局部变量 一个模块中,最高级别的变量有全局作用域. 全局变量一个特征就是:除非被删除, ...

  7. Python【知识点】傻傻的函数内变量

    问题的由来 有个学生问我一个问题关于函数内部变量的我们来一起看下代码: Code1 x = 50 def func(): print(x) global x print("x修改前的值:&q ...

  8. python 函数指动态形参,作用域

    函数的动态形参, 作用域 一 动态形参 如果我们需要给⼀一个函数传参, ⽽而参数⼜又是不确定的. 或者我给⼀一个 函数传很多参数, 我的形参就要写很多, 很⿇麻烦, 怎么办呢. 我们可以考虑使⽤用动态 ...

  9. python中对变量的作用域LEGB、闭包、装饰器基本理解

    一.作用域 在Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域.python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量 ...

随机推荐

  1. 改变jupyter notebook默认初始文件路径 - 关于快捷方式

    jupyter notebook home path changing - %USERFROFILE% and Configure file 如何改变jupyter notebook默认初始文件路径, ...

  2. system.data oracleClient 需要Oracle客户端8.1.7或high

  3. linux socket使用情况 ss -s ss -t -a | cat /proc/net/socketstat

    Linux系统中,查看SOCKET使用情况可以使用ss命令. 1.命令格式:ss [参数]ss [参数] [过滤]2.命令功能:ss(Socket Statistics的缩写)命令可以用来获取 soc ...

  4. 玩转音频、视频的利器:FFmpeg

    导语 当下直播平台发展十分迅猛,依靠游戏内直播平台的发展带动游戏活跃提升收入,那么对于我们开发来说如何玩转视频呢?下面就来介绍一个音频.视频处理利器——FFmpeg. FFmpeg 简介 FFmpeg ...

  5. Django--URL(路由层)

    一.django 静态文件配置 在配置文件中settings.py STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR ...

  6. 笨方法学python之转义字符

    ASCII码值(十进制) \a 响铃(BEL) 007 //响铃(有声音) \b 退格(BS) 008 //使当前的输出位置退一格,即输出的起始位置左移一位 */ \f 换页(FF) 012 //只有 ...

  7. 工作记录 rfcn网络结构 caffe time测速和实际运行中速度不相等。

    现象: 用caffe time测试网络结构,前向传播是 8 ms左右, 实际集成后运行的时候,forward耗时大概4-5ms. 输入大小是一致的. 于是开始查这个问题. 最后定位到,差别在propo ...

  8. 网关、子网掩码、DHCP, DNS

    都跟ip地址相关,IP地址构成:网络地址+主机地址 子网掩码可以确定网络地址,例如某IP:192.168.1.102 子网掩码:255.255.255.0, 那么网络地址就是192.168.1,主机地 ...

  9. 浅谈分布式消息技术 Kafka(转)

    一只神秘的程序猿. Kafka的基本介绍 Kafka是最初由Linkedin公司开发,是一个分布式.分区的.多副本的.多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可 ...

  10. void类型详解

    void含义 void的字面意思是"无类型",void*则为"无类型指针",void*可以指向任何类型的数据. void几乎只有"注释"和限 ...