一、关键字

golbal nonlocal

在局部修改全局的变量为什么会报错

count = 0

def func():
count += 1
func()
# UnboundLocalError: local variable 'count' referenced before assignment
# 解释器认为:如果你在局部作用域对一个变量进行修改了,你在局部作用域已经定义好这个变量了。

解释器认为: 如果你在局部作用域对一个变量进行修改,name你在局部作用域已经定义好这个变量了。

1. global (***)

用途

  • 可以在局部作用域申明一个全局变量

例题

def func():
global name # 用法
name = 'alex'
print(locals())
func() # 总结
# 申明一个变量的方法:global name
  • 可以在局部修改一个全局变量

例题

count = 0

def func():
global count
count += 1 print(count)
func()
print(count) # 输出结果
0
1 总结:
# 程序从上往下执行,先定义一个局部变量count = 0,然后往下执行,到print(count),这时候count指向的还是0,到func()也就是变量名加括号,开始执行定义函数,进入函数内部,声明count为全局变量,然后对count进行修改+1,跳出函数执行print(count),这个时候count已经+1操作,结果是1

2. nonlocal (了解)

用途

  • nonlocal不能操作全局变量
  • nonlocal 可以对父级作用域的变量进行修改,并且在当前作用域创建

例题

def func():
count = 0
def inner():
nonlocal count
count += 1
print(count)
print(locals())
inner()
print(locals())
func() # UnboundLocalError: local variable 'count' referenced before assignment # 在没有申明一个nolocal的情况下,定义函数在子局部对父局部的变量进行修改也会报错,原因如下:
# 解释器认为:如果你在局部作用域对一个变量进行修改了,
# 你在局部作用域已经定义好这个变量了。

一句话总结

全局有count = 0 这个变量,或者在函数内部申明一个global count,此时在局部才可以对全局变量进行修改

# 正确的操作方法
count = 0
def func():
global count
count += 1
return count
print(func())

python之golbal/nonlocal的更多相关文章

  1. python global vs nonlocal (2)

    上一篇中简述了这两个关键字的基本用法: global用于在局部作用于修改或重定义全局变量 nonlocal用于在内部作用域修改或重定义外部变量(全局变量除外) 这只是很浅的理解方式 注意python的 ...

  2. [python]global与nonlocal关键字

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

  3. python global和nonlocal的使用

    ◆global和nonlocal是Python的两个重要变量作用域关键字 1.global用在全局变量,应用场景: 变量定义在函数外部的时候,如果函数里面想改变这个全局变量的值,需要在当前的引用函数里 ...

  4. Python Global和Nonlocal的用法

    nonlocal 和 global 也很容易混淆.简单记录下自己的理解. 解释 global 总之一句话,作用域是全局的,就是会修改这个变量对应地址的值. global 语句是一个声明,它适用于整个当 ...

  5. python 中的nonlocal

    python 中nonloal 关键字用来在函数或其他作用域中使用外层变量(非全局),也可使用global需要在函数外部

  6. [Python] Symbol Review

    From:http://learnpythonthehardway.org/book/ex37.html 1. with X as Y: pass 1.1 yield 2. exec 2.1 name ...

  7. python全栈学习--day11(函数高级应用)

    一,函数名是什么? 函数名是函数的名字,本质:变量,特殊的变量. 函数名()执行此函数 ''' 在函数的执行(调用)时:打散. *可迭代对象(str,tuple,list,dict(key))每一个元 ...

  8. python之全局变量与局部变量

    全局变量: -   在书写中顶格开始: -   一旦定义完毕在整个文件生效: -   在函数内如果定义了同名全局变量名,会“覆盖”掉全局变量: -   在函数中同名的变量,当在函数退出后消失,全局的同 ...

  9. 嵌套函数变量修改nonlocal & 全局变量修改global

    前几天在做一个简单的界面,单击Radiobutton保存字符串,在一个嵌套函数里面修改外部函数.一直不知道怎么修改,上网查了一下,搜关键字“嵌套函数修改变量”,找了好久,才得以解决. 对于python ...

随机推荐

  1. MySQL生成UUID

    UUID函数 在MySQL中,可以用uuid()函数来生成一个UUID,如下图: replace函数 默认生成的uuid含有'-',我们可以使用replace函数替换掉'-',SQL如下: selec ...

  2. poj2449(k短路&A_star模板)

    题目链接:http://poj.org/problem?id=2449 题意:给出一个有向图,求s到t的第k短路: 思路:k短路模板题,可以用A_star模板过: 单源点最短路径+高级搜索A*;A*算 ...

  3. Candies

    Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submissions: 30247   Accepted: 8409 Descrip ...

  4. django视图 CBV 和 FBV

    目录 视图 CBV 和 FBV 什么是视图? FBV function based view 基于函数的视图 CBV class based view 基于类的视图 小技巧 CBV 如何获取页面请求类 ...

  5. C# IE环境 - 重置IE(WshShell & Rundll32)

    前言 IE问题: 如何重置IE选项? 通过修改注册表,理论上是可行的.前提是你知道重置IE时,有多少注册表项要更改. 如果能直接调用IE的重置设置窗口,并执行重置,能完美重置IE. WshShell ...

  6. King's Pilots

    题目链接   (双层图, 一层维护工作,一层维护政策) #include <bits/stdc++.h> using namespace std; inline int read() { ...

  7. 《SQL 进阶教程》 case:在 CASE 表达式中使用聚合函数

    1.只加入一个社团的学生的社团id select std_id, max(club_id) from student_clubgroup by std_idhaving count(*) =1---- ...

  8. python进阶04 装饰器、描述器、常用内置装饰器

    python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...

  9. 【BZOJ2428】均分数据

    题解 先说说黄学长的做法: 当温度比较高的时候,贪心 每次随机一个数,把他放进当前和最少的那一组里面 温度足够低的时候就完全随机然后转移 对于一个排列,分组强制连续 答案显然唯一,做一遍(dp)就好 ...

  10. 题解 BZOJ 1912 && luogu P3629 [APIO2010]巡逻 (树的直径)

    本来抄了篇题解,后来觉得题解都太不友好(我太菜了),一气之下自己打...一打打到第二天QAQ 首先什么边也不加时,总路程就是2*(n-1) 考虑k=1的时候,答案显然是2*(n-1)-直径+1=2*n ...