Python 学习笔记 - 作用域小知识

简介:

Python的作用域和其他语言有所不同,他有几个小窍门来判断作用域。


1. Python里面没有块级别的作用域;只有函数级别的作用域。


比如说,下面这个例子,如果是Java或者其他语言,肯定报错name没有定义。Python里面因为不存在块级别的作用域,因此name直接就输出9了

1
2
3
4
5
>>>  for  in  range ( 10 ):
     name = i
print (name)
- - - - - - - - - -
9


2. 作用域链的顺序是从内往外找,直到找不到为止

例如

1
2
3
4
5
6
7
8
9
10
11
>>>  def  f1():
     name = 'a'
     def  f2():
         name = 'b'
         print (name)
     f2()
     print (name)
f1()
- - - - - - - - - - - - - -
b
a


3. 函数没有执行之前,作用域已经确定了,作用域链也已经确定了。

例如 f0()执行之前,已经确定了name就是alex,因此不管他如何调用,输出总是alex

1
2
3
4
5
6
7
8
9
10
11
12
>>> name = 'alex'
def  f0():
     print (name)
def  f1():
     name = 'bbb'
     f0()
def  f2():
     name = 'eric'
     f1()
f2()
- - - - - - - - - - - - - - - - -
alex


下面看几个特殊的例子和语法


比如,我们可以通过下面的方式给列表赋值

1
2
3
4
5
6
7
>>> li = [x + 100  for  in  range ( 10 )]
print (li)
li = [x + 100  for  in  range ( 10 if  x> 6 ]
print (li)
- - - - - - - - - - - -
[ 100 101 102 103 104 105 106 107 108 109 ]
[ 107 108 109 ]


如果把上面的例子改成lambda表达式,那么因为lambda其实就是函数,他在未执行前是不会执行内部代码的,因此列表里面的每个元素都是函数,当我们()来执行的时候,他会尝试返回X,而X这个时候在10次循环之后已经是9了

1
2
3
4
5
6
7
>>>  #li列表里面的元素[函数,函数,函数],函数在没有执行前,内部代码不执行
li = [ lambda  :x  for  in  range ( 10 )]
print (li)
print (li[ 0 ]())
- - - - - - - - - - - - - - - - -
[<function <listcomp>.< lambda > at  0x0000019EA4515BF8 >, <function <listcomp>.< lambda > at  0x0000019EA4515C80 >, <function <listcomp>.< lambda > at  0x0000019EA4515D08 >, <function <listcomp>.< lambda > at  0x0000019EA4515D90 >, <function <listcomp>.< lambda > at  0x0000019EA4515E18 >, <function <listcomp>.< lambda > at  0x0000019EA4515EA0 >, <function <listcomp>.< lambda > at  0x0000019EA4515F28 >, <function <listcomp>.< lambda > at  0x0000019EA452B048 >, <function <listcomp>.< lambda > at  0x0000019EA452B0D0 >, <function <listcomp>.< lambda > at  0x0000019EA452B158 >]
9



换一种容易理解的写法。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
>> li = []
for  in  range ( 10 ):
     def  f1():
         return  i
     li.append(f1)
#li是列表,内部元素是相同功能的函数
#i=9
print (i)
## f1 没有调用之前,内部代码不执行;因此li内部都是函数
##真正执行() 时候,他会返回i,内部没有i,往上找,i已经是9了,因此返回9
print (li[ 0 ]())
print (li[ 2 ]())
9
9


如果改成x=i,f1初始化的时候会指定x的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> li = []
for  in  range ( 10 ):
     def  f1(x = i):
         return  x
     li.append(f1)
#li是列表,内部元素是相同功能的函数
#i
print (i)
## f1 没有调用之前,内部代码不执行;因此li内部都是函数
##真正执行() 时候,他会返回i,内部没有i,往上找,i已经是9了,因此返回9
print (li[ 0 ]())
print (li[ 2 ]())
9
0
2





本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1861879,如需转载请自行联系原作者

目录
相关文章
|
27天前
|
存储 C语言 Python
【Python】学习笔记day3
【Python】学习笔记day3
27 1
|
1月前
|
Python
Python系列(5)—— 作用域
Python系列(5)—— 作用域
|
1月前
|
Python
Python新手常见问题三:如何正确理解Python作用域?
在学习Python编程的过程中,理解和掌握作用域(Scope)的概念至关重要。它直接影响到变量的可见性、生命周期以及程序结构的设计。然而,对于许多初学者而言,Python的作用域规则有时可能显得有些神秘和复杂。本文将深入剖析Python作用域的基本原理,并通过实例讲解如何在实际编程中正确应用。
21 1
|
4月前
|
SQL 分布式计算 大数据
Python+大数据学习笔记(一)
Python+大数据学习笔记(一)
44 0
|
5月前
|
存储 Python
python基础 - python命名空间与作用域
python基础 - python命名空间与作用域
|
9天前
|
Python
基于Django的Python应用—学习笔记—功能完善
基于Django的Python应用—学习笔记—功能完善
|
10天前
05-python之函数-函数的定义/函数的参数/函数返回值/函数说明文档/函数的嵌套使用/函数变量的作用域
05-python之函数-函数的定义/函数的参数/函数返回值/函数说明文档/函数的嵌套使用/函数变量的作用域
|
27天前
|
存储 C语言 芯片
【Python】学习笔记day1
【Python】学习笔记day1
33 1
|
1月前
|
算法 搜索推荐 测试技术
python排序算法及优化学习笔记1
python实现的简单的排序算法,以及算法优化,学习笔记1
33 1
|
1月前
|
存储 算法 数据挖掘
【Python 基础教程 25】全面入门指南:深度解析Python3的命名空间,作用域及变量使用教程
【Python 基础教程 25】全面入门指南:深度解析Python3的命名空间,作用域及变量使用教程
56 0