1、块级作用域

想想此时运行下面的程序会有输出吗?执行会成功吗?

1

2

3

4

5

6

7

8

9

10

11

12

#块级作用域

if 1 == 1:

name= "lzl"

print(name)

for iin range(10):

age= i

print(age)

我们先看下执行结果

1

2

3

4

5

C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py

lzl

9

Process finished with exit code0

代码执行成功,没有问题;在Java/C#中,执行上面的代码会提示name,age没有定义,而在Python中可以执行成功,这是因为在Python中是没有块级作用域的,代码块里的变量,外部可以调用,所以可运行成功;

2、局部作用域

回顾之前学过的知识,我们学函数的时候,函数是个单独的作用域,Python中没有块级作用域,但是有局部作用域;看看下面的代码

1

2

3

4

5

6

#局部作用域

def func():

name= "lzl"

print(name)

运行这段代码,想想会不会有输出?

1

2

3

4

Traceback (most recent call last):

File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py", line23,in

print(name)

NameError: name'name' is not defined

运行报错,我相信这个大家都能理解,name变量只在func()函数内部中生效,所以在全局中是没法调用的;对上面代码做个简单调整,再看看结果如何?

1

2

3

4

5

6

7

#局部作用域

def func():

name= "lzl"

func()#执行函数

print(name)

对之前的代码添加了一句代码,在变量name打印之前,执行了一下函数,此时打印会不会有变化?

1

2

3

4

Traceback (most recent call last):

File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py", line23,in

print(name)

NameError: name'name' is not defined

执行依然报错,还是回到刚才那句话:即使执行了一下函数,name的作用域也只是在函数内部,外部依然无法进行调用;把前两个知识点记住,接下来要开始放大招了

3、作用域链

对函数做下调整,看看下面的代码执行结果如何?

1

2

3

4

5

6

7

8

9

10

#作用域链

name= "lzl"

def f1():

name= "Eric"

def f2():

name= "Snor"

print(name)

f2()

f1()

学过函数,肯定知道最后f1()执行完会输出Snor;我们先记住一个概念,Python中有作用域链,变量会由内到外找,先去自己作用域去找,自己没有再去上级去找,直到找不到报错

4、终极版作用域

好,铺垫了够了,终极版的来了~~

1

2

3

4

5

6

7

8

9

10

11

12

#终极版作用域

name= "lzl"

def f1():

print(name)

def f2():

name= "eric"

f1()

f2()

想想最后f2()执行结果是打印“lzl”呢,还是打印“eric”?记住自己的答案,现在先不把答案贴出来,先看看下面这段代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#终极版作用域

name= "lzl"

def f1():

print(name)

def f2():

name= "eric"

return f1

ret= f2()

ret()

#输出:lzl

执行结果为“lzl”,分析下上面的代码,f2()执行结果为函数f1的内存地址,即ret=f1;执行ret()等同于执行f1(),执行f1()时与f2()没有任何关系,name=“lzl”与f1()在一个作用域链,函数内部没有变量是会向外找,所以此时变量name值为“lzl”;理解了这个,那么刚才没给出答案的那个终极代码你也知道答案了

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#终极版作用域

name= "lzl"

def f1():

print(name)

def f2():

name= "eric"

f1()

f2()

# 输出:lzl

是的,输出的是“lzl”,记住在函数未执行之前,作用域已经形成了,作用域链也生成了

5、新浪面试题

1

li= [lambda :xfor xin range(10)]

判断下li的类型?li里面的元素为什么类型?

1

2

3

4

5

print(type(li))

print(type(li[0]))

#

#

可以看到li为列表类型,list里面的元素为函数,那么打印list里面第一个元素的返回值,此时返回值为多少?

1

2

3

4

5

6

7

8

#lambada 面试题

li= [lambda :xfor xin range(10)]

res= li[0]()

print(res)

#输出:9

li第一个函数的返回值为9还不是0,记住:函数在没有执行前,内部代码不执行;博客里面的代码可以自己练练,加深下印象

6、补充一个

瞅瞅下面的代码:

1

2

3

4

5

6

7

8

def f1():

def f2():

print(name)

name= 'Jefrey'

return f2()

f1()

# Jefrey

函数内部的变量(name),优先去f2函数内部找,且只能在print(name)之前去定义;如果没有,跳出当前函数一层,去外部找变量定义即f1内部去找,跳出当前f2函数找变量定义时,无论变量定义在函数f2之前还是之后都是可以的;当外部f1有多个定义时,如何执行?

1

2

3

4

5

6

7

8

9

10

def f1():

name= 'lzl'

name= 'lianzhilei'

def f2():

print(name)

name= 'Jefrey'

f2()

f1()

# Jefrey

当外部函数里有多个变量定义时,找f2()执行时,执行最近上面的变量的值

python的作用域分别有几种_python 作用域知识点整理相关推荐

  1. python程序结构有哪几种_Python数据结构与算法(几种排序)小结

    Python数据结构与算法(几种排序) 数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺 ...

  2. python的作用域分别有几种_python中作用域与函数嵌套

    知识回顾: 拆解传参. 1.字典传参.使用** 2.列表传参.使用* 实际上我们在定义函数的时候,如果省略了星号,那么在调用函数的时候必须要省略星号,除非我们拆解后的参数个数刚好相等. 视频内容 本节 ...

  3. python的作用域分别有几种_Python的作用域

    如果习惯了C/C++,Java这类静态语言的作用域规则,那么在Python中就要格外注意.在代码中,我们经常会碰到同一个变量名出现在多个地方,它的作用域可能是不一样的.Python中有四种作用域:局部 ...

  4. python的sort方法是哪种_python中的sort方法使用详解

    Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明: 一.基本形式列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可 ...

  5. python组合类型有哪三种_Python基础语法三组合数据类型

    一.列表(Lists) 列表属于Python中的序列类型,它是任意对象的有序集合,通过 " 位置 "或者 " 索引 " 访问其中的元素,它具有可变对象.可变长度 ...

  6. python基本程序结构有几种_python基础梳理(一)(推荐)

    一.python程序的组成 表达式:建立并且处理数据对象且能返回数据对象的引用关系 示例:1 + 2 系统会产生1和2俩个对象,并且进行处理生产对象3,将对象3返回回去. 二.核心的数字类型 1.整型 ...

  7. python中代理模式分为几种_Python设计模式之代理模式实例详解

    本文实例讲述了Python设计模式之代理模式.分享给大家供大家参考,具体如下: 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 #!/usr/bin/env py ...

  8. python输入的方式有几种_Python输入方式具体的三种实现方式

    Python输入方式一个很多人都关心的问题,其实在实际中最实用的有三种输入方式.下面我们就来看看Python输入方式的具体办法.希望大家有所收获,只有这样才能更好的进行推广. 1.文件方式 将复制的代 ...

  9. python映射类型包括哪三种_Python映射类型

    映射对象用于将哈希表值映射到任意对象.在python中,有一种称为字典的映射类型.这是可变的. 字典的键是任意的.作为值,我们可以使用不同种类的元素,例如列表,整数或任何其他可变类型的对象. 一些与字 ...

最新文章

  1. Oracle将关闭Java.net和Kenai.com社区
  2. 浅谈:数据结构之双链表结构与代码模拟双链表的实现
  3. JavaScript 对象所有API解析【2020版】
  4. js 数组 ajax php,js里面的对象ajax post到php端直接变成数组了?
  5. 大学物理质点动力学思维导图_生理学 | 思维导图
  6. 前端学习(1452):表格案例--效果演示
  7. JAVA调用C语言程序
  8. 从业务到技术weibo link card快速接入思考-2014.09.20
  9. bzoj4423[AMPPZ2013]Bytehattan
  10. db2 reorg(转)
  11. WPC QI 无线充电
  12. SQL中EXISTS的用法
  13. php面向对象编程孙卫琴,什么是面向对象编程(OOP)?,面向对象编程孙卫琴
  14. java 加载3d模型_实现在Java 3D中载入外部3D模型文件方法详解
  15. PEGASUS: Pre-training with Extracted Gap-sentences for Abstractive Summarization论文笔记
  16. vscode误更新后,无法连接服务器,报“Acquiring lock on/home/~”和“过程试图写入的管道不存在”错误
  17. 华为云服务器查看备份文件,云服务器备份查看备份
  18. matlab fabs能用吗,为什么使用abs()或fabs()代替条件否定?
  19. 抽水马桶结构图及工作原理
  20. Leetcode 1196:最多可以买到的苹果数量(超详细的解法!!!)

热门文章

  1. android edittext的监听,android editText 监听事件
  2. php静态类 使用场景,【php】PHP静态方法和非静态方法的使用场景
  3. 100内奇数之和流程图_互联网人工智能编程语言Python之while循环详解
  4. 资料员考试题库计算机,资料员考试试题库及答案(5套).docx
  5. php静态stitac,php静态static介绍
  6. 杂志html转换服务平台,Verypdf HTML Converter(网页转换器)
  7. html清除视频缓存,html清除页面缓存
  8. form表单reset报 reset is not a function
  9. Lucene入门程序
  10. iText导出pdf,poi导出excel并下载到客户端