先列出参考链接:
python变量作用域–作者:lovingprince
python开发杂货铺:作用域的痛点—作者:Assassin
python中在哪些情况下必须使用global来声明全局变量
python程序员的10个常见问题

在对象内部访问外部变量

python能够改变变量作用域的代码段是def、class、lamda.
其实python内一切皆对象,函数也是对象,所以总结起来就是,一个对象内部的变量就是局部变量,外部的python默认都是全局变量,也就是函数可以随便访问,甚至可以修改列表,但是不能修改值,也就是说x=xxx这种语句是会报错的,举例:

def test1():print(a)
a = 'a'
test1()
>>
a
def test1():a[2] = 'x'print(a)
a = [1,2,3]
test1()
>>
[1,2,'x']

所以要小心这个坑,不要一不小心在函数内部改变了全局变量自己还不知道

>>> x = 10
>>> def foo():
...     x += 1
...     print x
...
>>> foo()
Traceback (most recent call last):File "<stdin>", line 1, in <module>File "<stdin>", line 2, in foo
UnboundLocalError: local variable 'x' referenced before assignment
>>> lst = [1, 2, 3]
>>> def foo1():
...     lst.append(5)   # 这没有问题...
...
>>> foo1()
>>> lst
[1, 2, 3, 5]>>> lst = [1, 2, 3]
>>> def foo2():
...     lst += [5]      # ... 这就有问题了!
...
>>> foo2()
Traceback (most recent call last):File "<stdin>", line 1, in <module>File "<stdin>", line 2, in foo
UnboundLocalError: local variable 'lst' referenced before assignment

python的作用域链

#终极版作用域name = "lzl"def f1():print(name)def f2():name = "eric"f1()f2()
>>
lzl

python的作用域是先从内部开始找,再向外扩展,寻找全局变量
输出为外部的值,此时f2()与f1()作用域是并列的,也就是说,python的作用域不会产生函数内的嵌套问题,不是函数自身内的作用域,就会向外找全局变量,除非你在一个函数定义中定义另一个函数,会产生作用域嵌套,因为在定义的时候,对象之间就有了隶属关系

def f1():def f2():print(name)name = 'Jefrey'return f2()
f1()# Jefrey

这太变态了,应该没有人会这么写代码来定义函数~!!!不过这只是用函数举例,在实际中很有可能局要定义对象嵌套的数据结构

在对象外部访问对象内部局部变量

方法1:global

对于一个全局变量,你的函数里如果只使用到了它的值,而没有对其赋值(指a = XXX这种写法)的话,就不需要声明global。相反,如果你对其赋了值的话,那么你就需要声明global。声明global的话,就表示你是在向一个全局变量赋值,而不是在向一个局部变量赋值。

def test1():global aa = a+1print(a)
name = "lzl"
a = 0
test1()
>>
1

方法2:在函数内部或者甚至函数外部增加函数这个对象的一个属性

def testvalue():testvalue.x = 1def test2():testvalue.y = 1
testvalue()
test2()
testvalue.x = testvalue.x+1
testvalue.y = testvalue.y+1
print(testvalue.x)
print(testvalue.y)
>>
2
2

[python]变量作用域问题相关推荐

  1. Python变量作用域问题

    本文最后更新于2018-6-20,可能会因为没有更新而失效.如已失效或需要修正,请联系我! 今天在用Python写程序时突然想起了Python变量作用域的问题,代码如下: def run():glob ...

  2. Python 变量作用域问题 函数名.变量名

    刚接触Python,主要想利用它做数据处理.我用的是Python2.7.5,win7系统 最近在看<机器学习实战>,第三章决策树中有一段代码,摘抄如下,对于用颜色标注部分,刚开始没看懂什么 ...

  3. Python 变量作用域与函数(4)

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  4. Python变量作用域(全局变量和局部变量)

    Python变量作用域(全局变量和局部变量) 所谓作用域(Scope),就是变量的有效范围,就是变量可以在哪个范围以内使用.有些变量可以在整段代码的任意位置使用,有些变量只能在函数内部使用,有些变量只 ...

  5. Python变量作用域的规则以及如何搜索内置作用域

    喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远!有不懂的问题可以私聊我哦! **作用域:**是指变量的生效范围,例如本地变量.全局变量描述的就是不同的生效范围 ...

  6. Python 变量作用域

    变量作用域(scope)在Python中是一个容易掉坑的地方. Python的作用域一共有4中,分别是: L (Local) 局部作用域 E (Enclosing) 闭包函数外的函数中 G (Glob ...

  7. 详解Python变量作用域

    本文暂时不讨论类定义中的变量(成员)作用域,改天可能会单独成文介绍. 变量作用域总起来说可以这么理解:1)在函数内如果只引用某个变量的值而没有为其赋新值,该变量为(隐式的)全局变量:2)如果在函数内某 ...

  8. Python 变量作用域和列表

    变量作用域 变量由作用范围限制 分类:按照作用域分类 全局(global):在函数外部定义 局部(local):在函数内部定义 变量的作用范围: 全局变量:在整个全局范围有效 全局碧昂量在局部可以使用 ...

  9. 【python教程入门学习】Python变量作用域(通俗易懂)

    Python 中变量的访问权限取决于其赋值的位置,这个位置被称为变量的作用域.Python 的作用域共有四种,分别是:局部作用域(Local,简写为 L).作用于闭包函数外的函数中的作用域(Enclo ...

最新文章

  1. 4 三元表达式 列表解析 生成器表达式
  2. Unity之Math等方法的使用
  3. 科普:算法岗是什么?我适不适合算法岗?选什么方向的算法岗?
  4. OpenCV: OpenCV人脸检测框可信度排序
  5. Mac用户装机必备——让 Mac 也能右键新建/剪切文件,多达 10 余项实用功能
  6. 存储过程测试dbms、lpad与chr(10)
  7. android 动态规划,7. 动态规划(二)Android移动应用开发.pdf
  8. 黑客攻击公司化:网络犯罪也有商业模式也有CEO
  9. java必须会的linux_java程序员必须要学会的linux命令总结(推荐)
  10. oracle100多g满了,Oracle11g ORA-00257归档日志满问题处理
  11. mysql工具——mysqlcheck(MYISAM)
  12. 德标螺纹规格对照表_德标等螺纹对照表.doc
  13. 《任正非:管理的灰度》总结反思
  14. 网络互连(IPV4+NAT技术+ARP+IPV6)
  15. ES监视器Watcher详解
  16. harry potter
  17. 自然语言处理NLP星空智能对话机器人系列:NLP on Transformers 101 第16章:Kaggle BERT比赛CommonLit Readability Prize赛题解析
  18. 自动升降压PD快充方案 30W快充TYPE-C方案
  19. Packet Tracer – 配置OSPF
  20. 聊聊新加坡的工作和生活

热门文章

  1. 【Matlab-NURBS工具箱简要教程及实例 】
  2. 路由器局域网设置_教你如何修改路由器LAN口IP地址的方法
  3. 使用Machin公式计算
  4. 训练过程出现trian_dice一直大于1(mask范围0-255转为0-1)
  5. Desmos图形计算器创建回归方程
  6. desmos绘制心形图案
  7. 武汉音乐学院计算机音乐作曲,武汉音乐学院作曲系6部学生作品入围2019年中国大学生计算机设计大赛决赛...
  8. Linux刻录固态硬盘教程,linux迁移至固态硬盘全过程
  9. 抖音04开头xgorgon、xlog、设备注册算法
  10. Troubleshooting: WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK!