1. 概述

  • 从“变量作用域”这个词不难看出:变量有作用范围限制

2. 分类

  • 按照作用域分类
  1. 全局(global):在函数外部定义
  2. 局部(local):在函数内部定义

3. 变量的作用范围

  • 全局变量:在整个全局范围都有效

    • 全局变量在局部可以使用(即,在函数内部可以使用在函数外部定义的变量)
  • 局部变量:仅在特定的局部范围内有效
    • 局部变量在出了自己的范围后就无法使用
  • LEGB 原则
    • L(Local)局部作用域
    • E(Enclosing function locale)外部嵌套函数作用域
    • G(Global module)函数定义所在模块作用域
    • B(Builtin):python 内置模块的作用域
    • LEGB 规定了查找一个名称的顺序为:local-->enclosing function locals-->global-->builtin

少废话,上例子

# 例1

num1 = 100		# 全局变量

def func():
print("num1 =", num1) num2 = 99 # 局部变量
print("num2 =", num2) return None print("num1 =", num1)
func()
print("num2 =", num2)
  • 运行结果

num1 = 100

num1 = 100

num2 = 99

---------------------------------------------------------------------------

NameError……name 'num2' is not defined


4. 将局部变量提升为全局变量

  • 使用 global

少废话,上例子

# 例2

def func():
global num1
num1 = 100
print("num1 =", num1) num2 = 99
print("num2 =", num2) return None func()
print("num1 =", num1)
  • 运行结果

num1 = 100

num2 = 99

num1 = 100


5. 内建函数 globals() 与 locals()

  • 通过 globals() 和 locals() 可以显示出全局变量和局部变量

少废话,上例子

# 例3

num1 = 1
num2 = 2 def func(n1, n2):
n3 = 666
print("Local s= {0}".format(locals()))
print("Globals = {0}".format(globals())) return None func(11, 22)
  • 运行结果

Locals = {'n1': 11, 'n2': 22, 'n3': 666}

Globals = {'name': 'main', 'doc': None, 'package': None, 'loader': <_frozen_importlib_external.SourceFileLoader object at 0x000001C21D86E940>, 'spec': None, 'annotations': {}, 'builtins': <module 'builtins' (built-in)>, 'file': '.\globals & locals.py', 'cached': None, 'num1': 1, 'num2': 2, 'func': <function func at 0x000001C21D82C2F0>}


6. 邪恶的 eval() 与 执行者 exec()

(1) eval()

  • 把一个字符串当成一个表达式来执行, 返回表达式执行后的结果
  • 示例
# 例4 eval(string_code, globals=None, locals=None)

num1 = 100
num2 = 200 num3 = num1 + num2
num4 = eval("num1+num2") print(num3)
print(num4)
  • 运行结果

300

300


(2) exec()

  • 跟 eval() 功能类似, 但 exec() 不返回结果
  • 示例
# 例5 exec(string_code, globals=None, locals=None)

num1 = 100
num2 = 200 num3 = num1 + num2
num4 = exec("print('num1 + num2 =', num1+num2)") print(num3)
print(num4)
  • 运行结果

num1 + num2 = 300

300

None


7. 递归函数

(1) 概述

  • 简单地说,就是“我调用我自己”
  • 优点:简洁,容易理解
  • 缺点:对递归深度有限制,消耗资源大
    • python 对递归深度有限制,超过限制报错
    • 也可以手动更改递归深度
  • 写递归程序时,要注意结束条件

(2) 少废话,上例子

# 例6 错误示范

num = 0

def func():	# 会暴走的
global num
num += 1
print(num) func() # 调用自己 return None func()
  • 运行结果

先是像 excel 一样,纵向数字累加,然后抛出异常。

RecursionError……maximum recursion depth exceeded while calling a Python object

递归错误:调用 python 对象时超过了最大递归深度。


# 例7 斐波那契额数列
# 数学公式为: f(1) = 1, f(2) = 1, ... f(n) = f(n-1) + f(n-2) def fib(n): # n 表示斐波那契数列的第 n 个数
if n == 1 or n ==2: # or 表示或者
return 1 return fib(n-1) + fib(n-2) print(fib(10))
  • 运行结果

55

[Python3] 020 借函数,谈一谈变量的作用域的更多相关文章

  1. 『无为则无心』Python函数 — 30、Python变量的作用域

    目录 1.作用于的概念 2.局部变量 3.全局变量 4.变量的查找 5.作用域中可变数据类型变量 6.多函数程序执行流程 1.作用于的概念 变量作用域指的是变量生效的范围,在Python中一共有两种作 ...

  2. C++拷贝函数的小结,关于变量的作用域等---ShinePans

    #include <iostream> using namespace std; class circle { private: double r0; public: circle(dou ...

  3. Python 学习 第七篇:函数1(定义、调用和变量的作用域)

    函数是把一些语句集合在一起的程序结构,用于把复杂的流程细分成不同的组件,能够减少代码的冗余.代码的复用和修改代码的代价. 函数可以0个.1个或多个参数,向函数传递参数,可以控制函数的流程.函数还可以返 ...

  4. 转: 谈JAVA_OPTS环境变量不起作用

    谈JAVA_OPTS环境变量不起作用 2016-6-14 11:12 最近在处理运行一个java应用时,老是出现java.lang.OutOfMemoryError: Java heap space. ...

  5. python3 速查参考- python基础 6 -> 函数编程之参数、变量、作用域、递归、匿名函数 lambda

    函数基础 1. 速查笔记 #-- 函数相关的语句和表达式 myfunc('spam') # 函数调用 def myfunc(): # 函数定义 return None # 函数返回值 global a ...

  6. 谈一谈Java8的函数式编程(二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...

  7. python3内置函数大全(顺序排列)

    python3内置函数大全 内置函数 (1)abs(),   绝对值或复数的模 1 print(abs(-6))#>>>>6 (2)all() 接受一个迭代器,如果迭代器的所有 ...

  8. python3内置函数大全

    由于面试的时候有时候会问到python的几个基本内置函数,由于记不太清,就比较难受,于是呕心沥血总结了一下python3的基本内置函数 Github源码:        https://github. ...

  9. python3入门之函数

    相信大家学习过其他语言,懂得函数的作用.简单的说函数最好的作用就是可以使程序变得懒惰.python作为后起之秀,当然也会拥有函数这个有用的东西: 创建函数 使用def语句即可创建函数,如创建一个用来生 ...

随机推荐

  1. hdu2955_Robberies 01背包

    有一个强盗要去几个银行偷盗,他既想多投点钱,又想尽量不被抓到.已知各个银行 的金钱数和被抓的概率,以及强盗能容忍的最大被抓概率.求他最多能偷到多少钱? 解:以概率为价值 问价值在合理范围背包的最大容量 ...

  2. 对table最后一行显示与隐藏

    //显示table最后一行,如果用block的话,可能会影响到页面的样式 $("#table tr").get($("#table tr").length - ...

  3. 安装了sql-alchemy但导入sql_alchemy时失败

    问题描述:按成flask-sqlalchemy成功了,但是项目导入flask_alchemy时出错 但是,发现在代码中还是导入不了 之后发现问题,到file->setting->proje ...

  4. apache-2.4.x 编译安装方法

    apache-2.4.x 编译安装方法 作者:朱 茂海 /分类:Apache 字号:L M S apache-.2与新出的apache-.4安装不同的地方在于,.4版的已经不自带apr库,所以在安装a ...

  5. linux软件操作

    操作 命令 ubuntu 源操作 源配置 https://www.cnblogs.com/wenlin-gk/p/11146228.html 源更新 sudo apt-get update 查看源中包 ...

  6. NOIP2017 D1T1 小凯的疑惑

    洛谷P3951 看到题目,很容易想到这一题是求使ax+by=c(a,b,c∈N)无非负整数解的最大c 由裴蜀定理可知方程一定有整数解(a,b互素,gcd(a,b)=1|c) 解法一:暴力枚举 看到题目 ...

  7. 【BZOJ1488】[HNOI2009]图的同构计数

    题目链接 题意 求 n 个点的同构意义下不同的图的数量.\((n\leq 60)\) Sol \(Polya\) 定理的练手题. 我们这里先把边的存在与否变成对边进行黑白染色,白色代表不存在,这样就变 ...

  8. [洛谷P4436] HNOI/AHOI2018 游戏

    问题描述 一次小G和小H在玩寻宝游戏,有n个房间排成一列,编号为1,2,...,n,相邻的房间之间都有一道门.其中一部分门上锁(因此需要有对应的钥匙才能开门),其余的门都能直接打开.现在小G告诉了小H ...

  9. CSS插入的四种方式

    一.什么是CSS CSS(Cascading style sheets  层叠样式表),CSS可以用以为网页构建样式表,通过样式表来达到对网页进行美化的效果.所谓层叠可以将网页想象成一层层的结构,高层 ...

  10. Java基础之方法详解

    方法的所属性 在Java的语言中,方法相当于C语言中的函数,但是它与传统的函数也有着明确的不同:在结构化的语言中,函数是一等公民,整个程序是由一个个函数组成的:但是在面向对象的语言里,类是一等公民,整 ...