全局变量和局部变量

全局变量与局部变量两者的本质区别就是在于作用域。

用通俗的话来理解的话,全局变量是在整个py文件中声明,全局范围内都可以访问。局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就爆掉了。

  • 在子程序中定义的变量称为局部变量,只在子程序内部生效,
  • 在程序一开始定义的变量称为全局变量
  • 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
  • 当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用,在其他地方全局变量起作用

global 关键字定义全局变量

name = "xixi"  # 全局变量

def change_name():
name = "haha" # 局部变量只在函数局部作用域内生效
print("我的名字", name)
return change_name() # 调用函数时,打印函数内的局部变量name print(name) # 打印的是全局变量name def me():
global name # 声明name是全局变量 global
name = "yj" # 修改name全局变量的值
print(name)
return me() # 调用函数时打印的变量name是被修改过的全局变量
print(name) 结果如下: #我的名字 haha
#xixi
#yj
#yj

如果全局变量是可变的数据类型,函数可以对全局变量内部直接进行修改

eng = ["merry", "jack", "petter"]

def chang():
eng.append("mali")
print(eng)
return eng chang() #调用函数时,执行了append() #结果:
['merry', 'jack', 'petter', 'mali']

  

总结:

一般写程序变量的命名规则

###全局变量变量名大写

###局部变量变量名小写

  1. 函数优先读取局部变量,能读全局变量,无法对全局变量重新赋值操作,#全局变量是不可变的类型
  2. 全局变量是可变类型,函数可以对全局变量进行操作
  3. 函数中有global关键字,变量本质就是全局变量,可读取全局变量,也可操作全局变量

nonlocal关键字 

关键字nonlocal,字面意思就是指当前的这个变量不是局部变量,用来在函数或其他作用域中使用外层(非全局)变量。。nonlocal是Python3.0中新增的关键字,python2.x不支持

def make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter def make_counter_test():
mc = make_counter()
print(mc())
print(mc())
print(mc()) make_counter_test() #输出结果
1 2 3

  

def scope_test():
def do_local():
spam = "local spam" # 此函数定义了另外的一个spam字符串变量,并且生命周期只在此函数内。此处的spam和外层的spam是两个变量,如果写出spam = spam + “local spam” 会报错 def do_nonlocal():
nonlocal spam # 使用外层的spam变量
spam = "nonlocal spam" def do_global():
global spam
spam = "global spam" spam = "test spam" #第一步,定义外层函数变量赋值为“test spam”,生命周期在scope_test()内部,相对三个内部函数是个外部变量
do_local() #第二步,调用内部函数定义变量spam=“local spam”,生命周期仅在do_local()内,此处仅定义并赋值而已。
print("After local assignmane:", spam)#第三步:do_local()调用完成函数内spam失效,此处无法访问,打印同级spam="test spam"
do_nonlocal()#第四步,调用do_nonlocal(),并通过nonlocal对外层spam="test spam" 重新赋值spam = "nonlocal spam"
print("After nonlocal assignment:", spam)#第五步,打印spam = "nonlocal spam"
do_global()#第六步,调用do_global(),通过global定义spam全局变量,作用范围在scope_test()外
print("After global assignment:", spam)#第七步,打印scope_test()内部变量spam,但此时spam已被第四步重新赋值为"nonlocal spam" scope_test()#调用函数会按如止步骤执行 print("In global scope:", spam) #执行此处前,scope_test()执行完毕,其内部spam生命周期结束,但第六步,定义生成的全局变量依然存在,在此处会被输出 #输出结果: After local assignmane: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam

  

(十六)python 3 全局变量局部变量的更多相关文章

  1. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  2. 十六. Python基础(16)--内置函数-2

    十六. Python基础(16)--内置函数-2 1 ● 内置函数format() Convert a value to a "formatted" representation. ...

  3. python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码

    python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...

  4. 四十六 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中

    前面我们讲到的elasticsearch(搜索引擎)操作,如:增.删.改.查等操作都是用的elasticsearch的语言命令,就像sql命令一样,当然elasticsearch官方也提供了一个pyt ...

  5. 三十六 Python分布式爬虫打造搜索引擎Scrapy精讲—利用开源的scrapy-redis编写分布式爬虫代码

    scrapy-redis是一个可以scrapy结合redis搭建分布式爬虫的开源模块 scrapy-redis的依赖 Python 2.7, 3.4 or 3.5,Python支持版本 Redis & ...

  6. 二十六 Python分布式爬虫打造搜索引擎Scrapy精讲—通过downloadmiddleware中间件全局随机更换user-agent浏览器用户代理

    downloadmiddleware介绍中间件是一个框架,可以连接到请求/响应处理中.这是一种很轻的.低层次的系统,可以改变Scrapy的请求和回应.也就是在Requests请求和Response响应 ...

  7. Python核心技术与实战——十六|Python协程

    我们在上一章将生成器的时候最后写了,在Python2中生成器还扮演了一个重要的角色——实现Python的协程.那什么是协程呢? 协程 协程是实现并发编程的一种方式.提到并发,肯很多人都会想到多线程/多 ...

  8. python学习笔记(十六)-Python多线程多进程

    一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...

  9. Python之路【第十六篇】:Django【基础篇】

    Python之路[第十六篇]:Django[基础篇]   Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...

随机推荐

  1. update cdh version ,but cdh use old conf ,problem solve

    最近升级cdh版本,从4.5 升级到 5.0.0 beta-2 但是升级后,发现/etc/alternatives 路径下的软链接还是只想旧的4.5 版本,而且hadoop环境也是沿用4.5 的版本c ...

  2. 跟我一起玩Win32开发(22):抓取屏幕

    关于如何拷贝屏幕并保存,这里已经有现成的例子,我也不必去Copy人家了,我一向不喜欢Copy.这里有一个完整的例子,可以看看. http://msdn.microsoft.com/EN-US/libr ...

  3. multiprocessing多进程模块

    1 基本理解 python不支持真多线程,无法在单进程中调用多核cpu.对于cpu密集型任务,可以使用多进程.python会调用OS原生多进程,运行在多核上,以此提高运行速度. 2 基本实现 impo ...

  4. Udp实现省略编码

    class My_Socket(socket.socket): def __init__(self, encoding='utf-8'): self.encoding = encoding super ...

  5. Mysql的外键

    概念:如果一个实体A的某一字段,刚好指向或引用另一个实体B的主键,那么实体A的这个字段就叫作外键,所以简单来说,外键就是外面的主键,就是其他表的主键. 例: 以上的学生表的班级字段,就是一个外键! 其 ...

  6. SpringMVC-核心配置文件spring-mvc.xml

    @Spring-MVC.xml @MVC的注解驱动 Bean模式 上面源码的配置我们看到了,其中映射器和适配器的注解模式是过时的所以我们需要重新配置一下. <!-- 配置处理器映射器 --> ...

  7. SqlParameter 操作 image 字段

    public static void AddEmployee( string lastName, string firstName, string title, DateTime hireDate, ...

  8. JVM内存配置参数-XMX,-XMS,-XMN的例子

    转载:http://www.nowcoder.com/questionTerminal/093bfa948d144ce3b0a68b938ae8b4ec 对于JVM内存配置参数: -Xmx10240m ...

  9. 设计模式(3)-- 原型模式 (clone分析)

    原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建对象. 在java中有语言级别的支持:clone 在java中使用原型模式是非常简单的事情,实现Cloneable接口,调用Objec ...

  10. CF963A Alternating Sum

    思路:利用周期性转化为等比数列求和. 注意当a != b的时候 bk * inv(ak) % (109 + 9)依然有可能等于1,不知道为什么. 实现: #include <bits/stdc+ ...