函数作用域

a = 1

print("函数outer调用之前全局变量a的内存地址: ", a , id(a))

def outer():

a = 2

print("函数outer调用之时闭包外部的变量a的内存地址: ", a, id(a))

def inner():

a = 3

print("函数inner调用之时闭包内部变量a的内存地址: ", a, id(a))

inner()

print("函数inner调用之后闭包外部的变量a的内存地址: ", a, id(a))

outer()

print("函数outer执行完毕,全局变量a的内存地址: ", a, id(a))

函数outer调用之前全局变量a的内存地址: 1 140704120484688

函数outer调用之时闭包外部的变量a的内存地址: 2 140704120484720

函数inner调用之时闭包内部变量a的内存地址: 3 140704120484752

函数inner调用之后闭包外部的变量a的内存地址: 2 140704120484720

函数outer执行完毕,全局变量a的内存地址: 1 140704120484688

global 关键字

a = 1

print("函数outer调用之前全局变量a的内存地址: ",a , id(a))

def outer():

a = 2

print("函数outer调用之时闭包外部的变量a的内存地址: ", a, id(a))

def inner():

global a #这里更改了!!!

a = 3

print("函数inner调用之时闭包内部变量a的内存地址: ", a, id(a))

inner()

print("函数inner调用之后闭包外部的变量a的内存地址: ", a, id(a))

outer()

print("函数outer执行完毕,全局变量a的内存地址: ", a, id(a))

函数outer调用之前全局变量a的内存地址: 1 140704120484688

函数outer调用之时闭包外部的变量a的内存地址: 2 140704120484720

函数inner调用之时闭包内部变量a的内存地址: 3 140704120484752

函数inner调用之后闭包外部的变量a的内存地址: 2 140704120484720

函数outer执行完毕,全局变量a的内存地址: 3 140704120484752

把inner函数内的a声明为global后,更改的是最外层的a,最外层a原来为1,更改后为3。

nonlocal 关键字

a = 1

print("函数outer调用之前全局变量a的内存地址: ",a , id(a))

def outer():

a = 2

print("函数outer调用之时闭包外部的变量a的内存地址: ", a, id(a))

def inner():

nonlocal a #这里又更改了

a = 3

print("函数inner调用之时闭包内部变量a的内存地址: ", a, id(a))

inner()

print("函数inner调用之后闭包外部的变量a的内存地址: ", a, id(a))

outer()

print("函数outer执行完毕,全局变量a的内存地址: ", a, id(a))

函数outer调用之前全局变量a的内存地址: 1 140704120484688

函数outer调用之时闭包外部的变量a的内存地址: 2 140704120484720

函数inner调用之时闭包内部变量a的内存地址: 3 140704120484752

函数inner调用之后闭包外部的变量a的内存地址: 3 140704120484752

函数outer执行完毕,全局变量a的内存地址: 1 140704120484688

nonlocal 关键字使inner函数中的a变为outer函数中的a,更改的是外边一层的a。

例题

a = 10

def test():

a += 1

print(a)

test()

结果: error

Python的规则是,如果在函数内部要修改一个变量,那么这个变量需要是内部变量,除非你用global声明了它是外部变量。很明显,我们没有在函数内部定义变量a,所以会弹出局部变量在未定义之前就引用的错误。

name ='jack'

def f1():

print(name)

def f2():

name = 'eric'

f1()

f2()

结果: jack

f2中调用f1,我们要从f1的定义处寻找最近的name定义,是外部的jack。

Python函数的作用域取决于其函数代码块在整体代码中的位置,而不是调用时机的位置。

name = 'jack'

def f2():

name = 'eric'

return f1

def f1():

print(name)

ret = f2()

ret()

结果:还是jack!!

python local global_python global与nonlocal关键字相关推荐

  1. python nonlocal的用法_python中的global和nonlocal关键字怎么使用

    global 和 nonlocal关键字 当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了. 以下实例修改全局变量 num: #!/usr/bin/python3 ...

  2. global 和 nonlocal关键字

    当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了. def fun(): global num1 num1=2 print("函数内修改后num1=&qu ...

  3. python local global_Python 关键字global全局变量详解

    变量作用域 一般在函数体外定义的变量成为全局变量,在函数内部定义的变量称为局部变量. 全局变量所有作用域都可用,局部变量只能在本函数可用,变量的使用顺序是,局部变量 > 全局变量, 也就是说:优 ...

  4. python global和nonlocal_3.关于作用域知识的额外补充global和nonlocal关键字

    本遍文章对global关键字和nonlocal关键字进行补充,这两个关键字在以后做python开发的时候,能不用尽量别用!最好别用!总会出现让你意想不到的后果... 1.先说第一种global,不管在 ...

  5. 滚雪球学 Python 之作用域下的 global 和 nonlocal 关键字

    橡皮擦,一个逗趣的互联网高级网虫,新的系列,让我们一起 Be More Pythonic. 滚雪球学 Python 第二轮 已完成的文章清单 十.global 和 nonlocal 作用域 10.1 ...

  6. global与nonlocal关键字

    在Python中,当引用一个变量的时候,对这个变量的搜索是按找本地作用域(Local).嵌套作用域(Enclosing function locals).全局作用域(Global).内置作用域(bui ...

  7. nonlocal python3_Python中的global和nonlocal关键字

    在进入正题之前先简单说明一下:局部变量:函数或者方法里面定义的变量: 全局变量:本文指module级别的变量(一个python文件就是一个module). global 先看个例子:a = 1 def ...

  8. Python手记:global 和 nonlocal的区别

    文章目录 序 一.Python的定义域 二.global的作用 三.nonlocal的作用 四.闭包 总结 序 学习过程中,我们会遇到两个有趣的关键字,一个是global,一个是nonlocal. 如 ...

  9. python local global_Python 变量作用域 LEGB (上)—— Local,Global,Builtin

    Python 变量作用域的规则是 LEGB LEGB含义解释: L -- Local(function):函数内的名字空间 E -- Enclosing function locals:外部嵌套函数的 ...

最新文章

  1. JVM---堆(对象分配过程)
  2. HtmlUnit解析动态网页并采集网页列表到Excel
  3. 【Alpha 冲刺】 10/12
  4. android客户端访问服务端,服务端返回json数据
  5. Windows 11 大更新!可安装超千款 Android 应用
  6. OpenShift上的Java EE工作流(技术提示#64)
  7. CSS :root 测试
  8. web 前端 如何分享到instagram_面对前端的后端化趋势,2020该如何学习web前端?
  9. c语言变量的值也可以不改变6,C语言学习复盘整理笔记(六)
  10. centos7下修改/找回mysql的密码,我这里是mysql5.7
  11. python编程是干嘛的-python编程能做什么开发
  12. Jenkins+MSbuild+SVN实现快速搭建.net持续集成环境(构建、编辑、部署到服务器)
  13. 【POCKET 51】用 pocket 51学51单片机 之四:pocket 51功能模块测试
  14. Android Studio 3.5.2 入门教程(浓缩版)
  15. 批量缩小图片大小的方法
  16. oracle表给用户授权
  17. python--飞机大战(课程设计)
  18. 个人隐私保护条例_个人资料(隐私)条例
  19. 代码BUG之曲线救国
  20. Windows下virtualbox相关软件安装设置全过程

热门文章

  1. emoji表情 与 iconfont 一锅炖
  2. __attribute__ ((packed))
  3. 本地jar文件中搜索class
  4. exchange迁移测试作业
  5. linux 服务搜索顺序文件 /etc/nsswitch.conf 简介
  6. golang 字符串拼接方式
  7. linux 源码目录结构 文件系统目录结构
  8. nmap脚本(nse)原理和编写
  9. QEMU支持的网络模式
  10. Windbg设置条件断点