python3的作用域和C/C++有所不同
1、 按照L -> E -> G -> B的顺序查找变量

L (Local) 局部作用域
E (Enclosing) 函数外上一层的函数中
G (Global) 全局作用域
B (Built-in) 内建作用域

2、只有在模块module,类class,函数def、lambda中才可以改变作用域,其他情况不可。

  • 例1

    def func():
    x= 100
    print(x)
    func()
    print(x)
    

    报错,因为第二个print(x)找不到变量x

  • 例2

    for i in range(4):x = i
    print(x)
    

    正确,因为for语句并不能隔离作用域

  • 例3

    x= 1
    def func():print xx= 2
    print func()
    

    报错UnboundLocalError: local variable 'x' referenced before assignment,因为虽然python是逐行解释的。但每个函数属于一个区块,这个区块范围是一次性解释的,并不会读一行忘记一行,而是一直读,读完整个区块再解释。python读完整个fun区块后,检测到定义了x,所以x是局部变量。但是print x的时候会去寻找局部变量x,此时x还没被赋值,所以报错。详见python3代码块

  • 例4

    x= 1
    def func():x += 1return x
    print func()
    

    报错UnboundLocalError: local variable 'x' referenced before assignment,因为x+=1实际上是x=x+1,函数内部只要是赋值操作就表示声明为局部变量,所以x是局部变量。所以出现了为赋值前就使用x,所以报错

  • 例5

    x= "abc"
    def func1():print(x)
    def func2():x= "def"func1()
    func2()
    

    输出abc,函数的定义位置决定了它所看见的变量,所以当调用func1()时,func1出于全局域中,会输出abc。

  • 例6

    x=3
    def func1():x=4def func2():print(x)x=5func2()
    func1()
    

    输出5,因为func2定义位置决定了看见的是func1的x,而在调用func2之前,func1的x已经赋值为5,故输出5

  • 例7

    x=3
    def func1():x=4def func2(x=x):x += 3print(x)x=5func2()
    func1()
    

    输出7,这里使用了默认参数,而默认参数是在生成函数而非调用函数时查找的,这里x=x,在执行到def的时候就引用为4了,但是其他参数,是在函数调用时查找的。

3、nonlocal默认将内层函数中的变量修饰为上一层函数的作用域范围,如果上一层函数中不存在该变量,则修饰为上上层、上上上层直到顶层函数,但不能修饰为全局作用域范围

4、global可以声明一个或多个变量为全局变量,多个变量使用逗号隔开,也可以声明事先不存在的变量为全局变量,但nonlocal修饰的变量必须已经存在于上层或上上层(或更多层)函数,不能只存在于全局。

参考链接:https://www.cnblogs.com/f-ck-need-u/p/9925021.html#python%E4%BD%9C%E7%94%A8%E5%9F%9F%E8%A7%84%E5%88%99%E7%AE%80%E4%BB%8B

python3作用域相关推荐

  1. python3代码块

    代码块可以使得一段python代码作为一个单元.一个整体执行.以下是 官方手册 的描述. 所以,有以下几种类型的代码块: 模块文件是一个代码块 函数体是一个代码块 class的定义是一个代码块 交互式 ...

  2. python3初学者注意事项

    1.python3没有字符类型,一个字符就是长度为1的字符串 2.python3字符串可以从右往左以-1索引,C++不支持 3.python3有列表[],元组(),集合{},字典{key:value} ...

  3. Python3 完全教程

    Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k.相对于 Python 的早期版本,这是一个较大的升级.为了不带入过多的累赘,Python 3.0 在设计的时候没有考 ...

  4. python语言入门w-python3入门之类

    在面向对象的语言中,类是最重要的一环,python自然拥有类这个机制.python的类机制,与C++,java的区别不是很大,类的大多数的重要特性都被沿用了,一样可以多态,抽象,封装: python3 ...

  5. Python课程学习笔记 上

    笔记目录 学前准备 Python解释器安装包 下载 安装 Pycharm 下载 常用的快捷键 Python程序执行机制 语法基础 注释和中文乱码 变量 数据类型 运算符 数值运算符 复合运算符 比较运 ...

  6. Python3 局部变量与全局变量作用域

    1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author:sking 4 #Python3 局部变量与全局变量作用域 5 6 name01 ...

  7. 浅谈Python3函数命名空间与作用域

    日期:2020年1月23日 作者:Commas 注释:前一章节讲述了命名空间和作用域的知识,现在我们来谈一谈Python3函数的命名空间吧. 如果您想了解更多有关Python的知识,那么请点<我 ...

  8. python3 获取 当前作用域 全部参数的内置方法 locals()

    在写程序时,经常会碰见传递过多参数的情况.先看一个例子 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author: wxnacy(wxnacy@gma ...

  9. [Python3] 020 借函数,谈一谈变量的作用域

    目录 1. 概述 2. 分类 3. 变量的作用范围 少废话,上例子 4. 将局部变量提升为全局变量 少废话,上例子 5. 内建函数 globals() 与 locals() 少废话,上例子 6. 邪恶 ...

最新文章

  1. 【opencv4】opencv视频教程 C++ 7、手动调整图像亮度与对比度 g(i, j) = αf(i, j) + β(点操作与邻域操作概念)
  2. 分享18道Java基础面试笔试题
  3. SAP License:搞砸SAP项目的3种方法
  4. python 玩公众号游戏_从零基础开始,用python手把手教你玩跳一跳小游戏,直接打出高分...
  5. 寄存器之通用寄存器(一)
  6. 【Django 2021年最新版教程33】Jmeter如何进行性能测试
  7. opengl工具库glfw一 创建窗口
  8. C# NamePipe使用小结
  9. Adobe Flash Player v26.0.0.126发布:请尽快更新
  10. COPRA-for-AutoCAD 2005
  11. figure字体 latex_Latex字体大小和样式
  12. word2010转html默认页面视图,word2010中,切换到页面视图方式的组合键
  13. ctf解密图片得到flag_图片隐藏flag怎么找
  14. 基于单片机的防盗报警监控系统设计(#0401)
  15. 《Python机器学习及实践:从零开始通往Kaggle竞赛之路》第4章 实战篇 学习笔记(三)4.3IMDB影评得分估计总结
  16. Codeforces Round #612 (Div. 2) C. Garland题解
  17. 三种方式实现echarts树图的背景图片设置
  18. 第二届“梧桐杯”复赛开战在即,邀您观赛!
  19. 【软考中级】软件设计师学习笔记
  20. [算法竞赛入门]第一章_算法概述

热门文章

  1. python3菜鸟教程-总算理解python3中文入门教程
  2. 在电脑上安装python的步骤-python中pygame安装过程(超级详细)
  3. python可以干嘛知乎-Python到底可以干什么?老男孩Python视频教程
  4. python快速入门答案-Python 快速入门笔记(1):简介
  5. python安装modify setup选哪-python 之禅 import this
  6. python比c语言好学吗-python和c语言哪个更适合初学者
  7. python发明者叫什么-近 50 年来最具影响力的 10 种编程语言,都是谁发明的?
  8. Teamviewer连接服务器显示不能够全屏 或 向日葵连接服务器不能够全屏 或 Teamviewer只显示一个640x480的分辨率选项
  9. 用Python提取解析pdf文档中内容
  10. protobuf3在php中的使用