python变量与作用域

发布时间:2022-04-06 09:42:12 人气:252 作者:多测师

  1. 变量的概念

  变量由两部分组成:变量名 和 变量值。变量值是存放在内存中的,变量的数据类型决定了其值在内存中的存放方式;变量名只是一个指向变量值所在内存空间地址的引用而已。

  Python中的变量回收机制:

  变量的值存放在内存空间中

  内存空间是有地址的(门牌号)

  变量名是对其变量值所在内存空间地址的引用

  Python解释器对内存地址引用次数是有记数的

  Python解释器会定期将引用次数为0的内存地址清空--释放

  函数名也是变量,函数体就是这个变量的值:

  calc = lambda x: x*3

  2. 作用域的概念

  Python的作用域一共有4种,分别是:

  L (Local) 局部作用域

  E (Enclosing) 闭包函数外的函数中

  G (Global) 全局作用域

  B (Built-in) 内建作用域

  查找变量的值时以 L --> E --> G -->B 的顺序进行查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。

  说明: Python除了def/class/lambda 外,其他如: if/elif/else/ try/except for/while并不能改变其作用域。定义在它们之内的变量,外部还是可以访问。

python变量与作用域

  3. 全局变量与局部变量

  一个程序中的变量是有作用域(scope)的,作用域的大小会限制变量可访问的范围。Python中的变量根据作用域范围的大小不同可以分为:全局变量和局部变量。顾名思义,全局变量表示变量在全局范围内都可以被访问,而局部变量只能在一个很小的范围内生效。这就好比国家主席与各省的省长:在全国范围内国家主席都是同一个人,因此国家主席就是个全局变量;而各省的省长只能在某个省内生效,河北省省长是一个人,河南省省长又是另外一个人,因此省长就是个局部变量。对于Python编程语言而言,定义在一个函数内部的变量就是一个局部变量,局部变量只能在其被声明的函数内访问;定义在函数外部的变量就是全局变量,全局变量可以在整个程序范围内访问。

  来看个示例:

  #!/usr/bin/env python

  # -*- encoding:utf-8 -*-

  name = 'Tom'

  def func1():

  age = 10

  print(name)

  print(age)

  def func2():

  sex = 'F'

  print(name)

  print(sex)

  print(name)

  func1()

  func2()

  输出结果:

  Tom

  Tom

  10

  Tom

  F

  上面的示例中,name是一个全局变量,因此它在程序的任何地方都可以被访问;而func1函数中的age变量和func2函数中的sex变量都是局部变量,因此它们只能在各自定义的函数中被访问。

  问题1:如果在函数内定义一个与全局变量同名的变量会怎样?

  #!/usr/bin/env python

  # -*- encoding:utf-8 -*-

  name = 'Tom'

  def func3():

  name = 'Jerry'

  print(name)

  print(name)

  func3()

  print(name)

  输出结果:

  Tom

  Jerry

  Tom

  通过上面两个示例的输出结果我们可以得出这样的结论:

  函数内引用一个变量时,会先查找该函数内部是否存在这样一个局部变量,如果存在则直接引用该局部变量,否则将查找并引用全局变量;

  对局部变量的赋值并不会对全局变量产生什么影响,因为它们本来就是两个不相关的变量。

  问题2:如果想在上面示例中的函数内部为全局变量重新赋值怎么办?

  可以在函数内部通过global关键字声明该局部变量就是全局变量:

  #!/usr/bin/env python

  # -*- encoding:utf-8 -*-

  name = 'Tom'

  def func4():

  global name

  name = 'Jerry'

  print(name)

  print(name)

  func4()

  print(name)

  输出结果:

  Tom

  Jerry

  Jerry

  可见全局name的值的确被func4函数内部的操作改变了。

  问题3:能不能将全局变量通过传参的方式传递给函数,然后在函数内部对全局变量做修改呢?

  变量值的改变通常有两种方式:(1) 重新赋值 (2) 改变原有值。要想在函数内部通过重新赋值来改变全局变量的值,则只能通过上面介绍的使用global关键字来完成,通过传参是无法实现的。而要想在函数内部改变全局变量的原有值的属性就要看该参数是值传递还是引用传递了,如果是引用传递则可以在函数内部对全局变量的值进行修改,如果是值传递则不可以实现。具体请看下面的分析。

  以上内容为大家介绍了python变量与作用域,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注多测师。https://www.e70w.com/xwzx/


返回列表
在线客服
联系方式

热线电话

17727591462

上班时间

周一到周五

二维码
线