千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:郑州千锋IT培训  >  行业资讯  >  Python中的全局变量与局部变量的技术学习

Python中的全局变量与局部变量的技术学习

来源:千锋教育
发布人:千锋老师
时间: 2018-07-03 14:41:00

  学习Python编程语言是一件非常枯燥的事情,但经历过这个阶段后,你的学习效率就会突飞猛进。千锋郑州Python培训的老师给你分享变量作用域的有效范围,巩固技术知识点。

千锋教育

  一. 变量作用域:变量的有效范围

  a) 引言:变量并不是在哪个位置都可以访问的,访问权取决于该变量实在哪里赋值的。在编程中,变量的作用域从代码结构上可以分成块级,函数,类,模块等。但是在python中没有块级作用域,也就是类似if语句块,for语句块是不存在作用域概念的。

  i. Test:

  >>> if True: # if语句块没有作用域

  x = 1

  >>> x

  1

  >>> def func(): # 函数有作用域

  a = 8

  >>> a

  Traceback (most recent call last):

  File "", line 1, in

  a

  NameError: name 'a' is not defined

  从上面的例子中,我们可以发现,在if语句内定义的变量x,可以被外部访问,而在函数func()中定义的变量a,则无法在外部访问。

  b) 全局变量和局部变量

  i. 概念:定义在函数内部的变量拥有一个局部作用域,被叫做局部变量。定义在函数外部的变量拥有一个全局作用域,被称为全局变量。类,模块同理。

  ii. 区别:局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内被访问。

  iii. global和nonlocal关键字

  1. 案例分析:

  total = 0 # total是一个全局变量

  def plus( arg1, arg2 ):

  total = arg1 + arg2 # total在这里是局部变量.

  print("函数内局部变量total= ", total)

  print("函数内的total的内存地址是: ", id(total))

  return total

  plus(10, 20)

  print("函数外部全局变量total= ", total)

  print("函数外的total的内存地址是: ", id(total))

  很明显,函数plus内部通过total = arg1 + arg2语句,新建了一个局部变量total,它和外面的全局变量total是两码事。而如果我们,想要在函数内部修改外面的全局变量total呢?使用global关键字!

  2. global:指定当前变量使用外部的全局变量

  Test:

  total = 0 # total是一个全局变量

  def plus( arg1, arg2 ):

  global total # 使用global关键字申明此处的total引用外部的total

  total = arg1 + arg2

  print("函数内局部变量total= ", total)

  print("函数内的total的内存地址是: ", id(total))

  return total

  plus(10, 20)

  print("函数外部全局变量total= ", total)

  print("函数外的total的内存地址是: ", id(total))

  打印结果是:

  函数内局部变量total= 30

  函数内的total的内存地址是: 503494624

  函数外部全局变量total= 30

  函数外的total的内存地址是: 503494624

  3. nonlocal:

  a) 案例分析:

  a = 1

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

  def outer():

  a = 2

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

  def inner():

  a = 3

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

  inner()

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

  outer()

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

  如果你将前面的知识点都理解通透了,那么这里应该没什么问题,三个a各是各的a,各自有不同的内存地址,是三个不同的变量。打印结果也很好的证明了这点:

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

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

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

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

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

  那么,如果,inner内部想使用outer里面的那个a,而不是全局变量的那个a,怎么办?用global关键字?答案是使用nonlocal关键字。

  b) 面试题:

  a = 10

  def test():

  a += 1

  print(a)

  test()

  解释:a += 1相当于a = a + 1,按照赋值运算符的规则是先计算右边的a+1。但是,Python的规则是,如果在函数内部要修改一个变量,那么这个变量需要是内部变量,除非你用global声明了它是外部变量。很明显,我们没有在函数内部定义变量a,所以会弹出局部变量在未定义之前就引用的错误。

  name ='jack'

  def f1():

  print(name)

  def f2():

  name = 'eric'

  f1()

  f2() #结果是‘jack’!

  解释:Python函数的作用域取决于其函数代码块在整体代码中的位置,而不是调用时机的位置。调用f1的时候,会去f1函数的定义体查找,对于f1函数,它的外部是name ='jack',而不是name = 'eric'。

  再看下面的例子,f2函数返回了f1函数:

  name = 'jack'

  def f2():

  name = 'eric'

  return f1

  def f1():

  print(name)

  ret = f2()

  ret()

  仔细回想前面的例子,其实这里有异曲同工之妙,所以结果还是‘jack’。

  二. range()函数

  a) test1: 循环变量1-100

  for i in range(10):

  print(i)

  注意:range会遍历从0到参数减1的数字

  Test2:也可以指定遍历的区间:

  for i in range(1, 12):

  print(i)

  会遍历从1到11的数字,左闭右开

  Test3:还可以指定步长,就像切片一样

  for i in range(1, 12, 2):

  print(i)

  test3:更多的时候是结合range()和len()函数,遍历一个序列的索引

  a = ['Google', 'Baidu', 'Huawei', 'Taobao', 'QQ']

  for i in range(len(a)):

  print(i, a[i])

  千锋郑州Python培训课程还有严格、科学、负责的教学就业管理制度,班主任、职业规划师全程跟班,把握每位学员的学习状态,并有专业的职业素养课和就业指导课,确保教学及就业质量。还有大量的免费Python视频教程帮助学员快速学习,更可以免费加入千锋开发者联盟,为会员提供免费技术支持及终身就业服务,免费参加千锋举办的各类技术沙龙和活动!

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

大数据培训要花多少钱

2023-04-12

计算机前端怎么学

2023-04-12

大数据都需要学什么?难不难

2023-03-30

最新文章NEW

javaee是前端还是后端,都学什么

2023-03-24

it前端是做什么的

2023-03-24

大数据培训要多久?你了解多少

2023-03-09

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>