Python中变量的作用域详解

目录
  • 1、作用于的概念
  • 2、局部变量
  • 3、全局变量
  • 4、变量的查找
  • 5、作用域中可变数据类型变量
  • 6、多函数程序执行流程
  • 总结

1、作用于的概念

变量作用域指的是变量生效的范围,在Python中一共有两种作用域。

全局作用域

全局作用域在程序执行时创建,在程序执行结束时销毁。所有函数以外的区域都是全局作用域。在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序的任意位置被访问。

函数作用域

函数作用域在函数调用时创建,在调用结束时销毁。函数每调用一次就会产生一个新的函数作用域(不调用不产生)。在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问。

2、局部变量

所谓局部变量是定义在函数体内部的变量,即只在函数体内部生效。

def testA():
    # 局部变量a
    # 在函数中为变量赋值时,默认都是为局部变量赋值
    # 局部变量不会影响函数外的变量。
    a = 100
    # 函数体内部访问,能访问到a变量
    print(a)

testA()  # 100
print(a)  # 报错:name 'a' is not defined

变量a是定义在testA函数内部的变量,在函数外部访问则立即报错。

局部变量的作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量。

3、全局变量

所谓全局变量,指的是在函数体内、外都能生效的变量。

思考:如果有一个数据,在函数A和函数B中都要使用,该怎么办?

答:将这个数据存储在一个全局变量里面。

# 定义全局变量a
a = 100

def testA():
    print(a)  # 访问全局变量a,并打印变量a存储的数据

def testB():
    print(a)  # 访问全局变量a,并打印变量a存储的数据

testA()  # 100
testB()  # 100

思考:testB函数需求修改变量a的值为200,如何修改程序?

a = 100

def testA():
    print(a)

def testB():
    a = 200
    print(a)

testA()  # 100
testB()  # 200
print(f'全局变量a = {a}')  # 全局变量a = 100

思考:在testB函数内部的a = 200中的变量a是在修改全局变量a吗?

答:不是。观察上述代码发现,15行得到a的数据是100,仍然是定义全局变量a时候的值,而没有返回

testB函数内部的200。综上:testB函数内部的a = 200是定义了一个局部变量。

(1)global关键字

思考:如何在函数体内部修改全局变量?

a = 100

def testA():
    print(a)

def testB():
    # 想要修改全局变量a的值是200
    # global 关键字声明a是全局变量
    global a
    a = 200
    print(a)

testA()  # 100
testB()  # 200
print(f'全局变量a = {a}')  # 全局变量a = 200

global关键字的作用是,在函数内部声明一个变量为全局变量。换句话说如果希望在函数内部修改全局变量,则需要使用global关键字来声明变量。

(2)总结

如果在函数里面直接把变量a=200赋值,此时的a不是全局变量的修改,而是相当于在函数内部声明了一个新的局部变量。函数体内部修改全局变量: 先global声明a为全局变量,然后再变量重新赋值。

4、变量的查找

当我们使用变量时,会优先在当前作用域中寻找该变量,如果有则使用,

如果没有则继续去上一级作用域中寻找,如果有则使用,

如果依然没有则继续去上一级作用域中寻找,以此类推。

直到找到全局作用域,依然没有找到,则会抛出异常 NameError: name 'a' is not defined

# 练习说明
a = 10
def fn2():
    def fn3():
        a = 30
        print('fn3中:','a =',a)
    fn3()
    print('fn2中:','a =',a)

fn2()
"""
输出结果:
fn3中: a = 30
fn2中: a = 10
"""

5、作用域中可变数据类型变量

c = 10
def fn4(a):
    # 在函数中对形参进行重新赋值,不会影响其他的变量
    a = 20
    print('a =', a, id(a))

fn4(c)
print('c =', c, id(c))
"""
输出结果:
a = 20 8791349231264
c = 10 8791349230944
"""

# 如果形参接收到的数据是一个全局列表
# 当在函数内尝试修改列表中的元素时,全局列表的数据也会发生改变
c = [1,2,3]
def fn4(a):
    # 如果形参执行的是一个对象,当我们通过形参去修改对象时
    # 会影响到所有指向该对象的变量
    a[0] = 100
    print('a =', a, id(a))

fn4(c)
print('c =', c, id(c))
"""
输出结果:
a = [100, 2, 3] 5132808
c = [100, 2, 3] 5132808
"""

# 如果我们不向全局变量有所改动
# 就需要使用我们之前学过的浅复制,
# 或者传入一个切片,就可以解决
c = [1, 2, 3]

def fn4(a):
    # 在函数中对形参进行重新赋值,不会影响其他的变量
    a[0] = 100
    print('a =', a, id(a))

fn4(c.copy())
# fn4(c[:])
print('c =', c, id(c))
"""
输出结果:
a = [100, 2, 3] 6050824
c = [1, 2, 3] 6050312
"""

6、多函数程序执行流程

一般在实际开发过程中,一个程序往往由多个函数组成,并且多个函数共享某些数据,如下所示:

(1)共用全局变量

# 1. 定义全局变量
glo_num = 0

def test1():
    global glo_num
    # 修改全局变量
    glo_num = 100

def test2():
    # 调用test1函数中修改后的全局变量
    print(glo_num)

# 2. 调用test1函数,执行函数内部代码:声明和修改全局变量
test1()
# 3. 调用test2函数,执行函数内部代码:打印
test2()  # 100

(2)返回值作为参数传递

# 先得到函数一的返回值,再把这个返回值传入到函数二
def test1():
    return 50

def test2(num):
    print(num)

# 1. 保存函数test1的返回值
result = test1()

# 2.将函数返回值所在变量作为参数传递到test2函数
test2(result)  # 50

总结

到此这篇关于Python中变量的作用域详解的文章就介绍到这了,更多相关Python变量的作用域内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 简单了解Python变量作用域正确使用方法

    在写代码的时候,免不了要使用变量.但程序中的一个变量并不一定是在哪里都可以被使用,根据情况不同,会有不同的"有效范围". 看这样一段代码: def func(x): print ('X in the beginning of func(x): ', x) x = 2 print ('X in the end of func(x): ', x) x = 50func(x)print ('X after calling func(x): ', x) 输出: X in the beginni

  • 什么是Python变量作用域

    在程序中定义一个变量时,这个变量是有作用范围的,变量的作用范围被称为它的作用域. 根据定义变量的位置,变量分为两种: 局部变量:在函数中定义的变量,包括参数,都被称为局部变量. 全局变量:在函数外面.全局范围内定义的变量,被称为全局变量. 每个函数在执行时,系统都会为该函数分配一块"临时内存空间",所有的局部变量都被保存在这块临时内存空间内.当函数执行完成后,这块内存空间就被释放了,这些局部变量也就失效了,因此离开函数之后就不能再访问局部变量了. 全局变量意味着它们可以在所有函数内被访

  • Python变量的作用域详解

    目录 总结 每个变量都有自己的作用域,在作用域外使用该变量非法 函数体内的变量为函数的局部变量,在函数体外不可使用 >>>def f(): x=5 >>>f() >>>print(x) #报错,x未被定义 >>>x=3#定义全局变量x >>>def f(): x=5 >>>f() >>>print(x) 3 #f()中的x=5不会影响全局变量 在局部变量和全局变量同名时,局部变量屏

  • python变量作用域与列表入门详解

    变量作用域 变量由作用范围限制 分类:按照作用域分类 全局(global):在函数外部定义 局部(local):在函数内部定义 变量的作用范围 全局变量:在整个全局范围都有效 全局变量在局部可以使用(即函数内部可以访问函数外部定义的变量) 局部变量在局部范围可以使用 局部变量在全局范围无法使用 LEGB原则 L(Local)局部作用域 E(Enclosing function local)外部嵌套函数作用域 G(Global module)函数定义所在模块作用域 B(Buildin):pytho

  • Python编程中闭包的变量作用域问题解析

    目录 闭包 闭包中的变量 闭包 ​ 在我们使用返回函数的时候,由于我们在一个函数中需要返回另一个函数,因此,我们在这个函数中就需要重新定义一个函数.而这样,就造成了我们的函数嵌套问题.外面的函数相对于里面的函数而言是外函数(outer function),而里面的我们叫他内函数(inner function). def outerFunction(): #外函数 def innerFunction(): #内函数 x = 1 return x return innerFunction #返回值是

  • 深入了解Python 变量作用域

    特点 python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量能被访问的范围.即Python变量的作用域由变量所在源代码中的位置决定.Python中并不是所有的语句块中都会产生作用域.只有当变量在Module(模块).Class(类).def(函数)中定义的时候,才会有作用域的概念. 1. 函数内部的变量,函数外部不能访问 def func(): variable = 100 print(variable) print(variable) # name 'variable' is

  • Python中变量的作用域详解

    目录 1.作用于的概念 2.局部变量 3.全局变量 4.变量的查找 5.作用域中可变数据类型变量 6.多函数程序执行流程 总结 1.作用于的概念 变量作用域指的是变量生效的范围,在Python中一共有两种作用域. 全局作用域 全局作用域在程序执行时创建,在程序执行结束时销毁.所有函数以外的区域都是全局作用域.在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序的任意位置被访问. 函数作用域 函数作用域在函数调用时创建,在调用结束时销毁.函数每调用一次就会产生一个新的函数作用域(不调用不产

  • JavaScript中变量的作用域详解

    一.变量的分类 在JavaScript中变量分为两种: 全局变量 局部变量 二.变量的作用域 1.局部变量的作用域 局部变量:在函数内部定义的变量称为局部变量,其作用域为该函数内部,在该函数外部不能被访问.看下面的例子: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" co

  • Python中的变量和作用域详解

    作用域介绍 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的: G:globa,全局变量,就是模块级别定义的变量: B:built-in,系统固定模块里面的变量,比如int, bytearray等. 搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB. x = int(2.9) # int bu

  • Python中的flask框架详解

    Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务.本文参考自Flask官方文档,大部分代码引用自官方文档. 安装flask 首先我们来安装Flask.最简单的办法就是使用pip. pip install flask 然后打开一个Python文件,输入下面的内容并运行该文件.然后访问localhost:5000,我们应当可以看到浏览器上输出了hello world. from flask import Flask app = Flask(

  • python中lambda匿名函数详解

    在Python中,不通过def来声明函数名字,而是通过lambda关键字来定义的函数称为匿名函数 关键字lambda表示匿名函数 语法 lambda 参数:表达式 先写lambda关键字,然后依次写匿名函数的参数,多个参数中间用逗号连接,然后是一个冒号,冒号后面写返回的表达式 lambda函数比普通函数更简洁 匿名函数有个好处:函数没有名字,不必担心函数名冲突 匿名函数与普通函数的对比 : def sum_func(a, b, c): return a + b + c sum_lambda =

  • python中模块导入模式详解

    目录 模块导入 1.1 import导入模块 1.2 from 模块名 import 导入模板的方法 1.3 as 关键字 OS模块操作文件 OS模块的作用 模块的制作.发布.安装 3.1 模块制作 3.2 模块的分 3.3 示例 3.4 测试方法 3.5 all魔术方法 模块导入 1.1 import导入模块 所谓的模块其实就是一个外部的工具包,其中存在的其实就是Python文件,这些文件都实现了某种特定的功能,我们导入包之后直接使用即可,非常的方便. 在开发中使用最多的就是使用: impor

  • python中 logging的使用详解

    日志是用来记录程序在运行过程中发生的状况,在程序开发过程中添加日志模块能够帮助我们了解程序运行过程中发生了哪些事件,这些事件也有轻重之分. 根据事件的轻重可分为以下几个级别: DEBUG: 详细信息,通常仅在诊断问题时才受到关注.整数level=10 INFO: 确认程序按预期工作.整数level=20 WARNING:出现了异常,但是不影响正常工作.整数level=30 ERROR:由于某些原因,程序 不能执行某些功能.整数level=40 CRITICAL:严重的错误,导致程序不能运行.整数

  • 关于JS变量和作用域详解

    ECMAScript 变量: 1.基本类型值(简单数据段) 2.引用类型值(可能由过个值构成的对象) → 保存在内存中的对象 ------ 动态属性: 只能给引用型值动态添加新属性,以便将来使用. ------ 复制变量值 : 基本类型值的复制 → 在变量对象上创建一个新值 → 复制给新变量(互不影响) 引用类型值的复制 → 将存储在变量对象中的值复制到新变量分配空间中(复制的是一个指针,指向同一个对象,相互影响) ------ 传递参数: ECMAScript中所有函数的参数都是按值传递 .

  • python中yield的用法详解——最简单,最清晰的解释

    首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考虑过读者的感受. 接下来是正题: 首先,如果你还没有对yield有个初步分认识,那么你先把yield看做"return",这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了.看做return之后再把它

  • python中yield的用法详解

    首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考虑过读者的感受. 接下来是正题: 首先,如果你还没有对yield有个初步分认识,那么你先把yield看做"return",这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了.看做return之后再把它

随机推荐