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,如需转载请自行联系原作者

目录
相关文章
|
28天前
|
网络协议 Java Linux
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
本文介绍了PyAV库,它是FFmpeg的Python绑定,提供了底层库的全部功能和控制。文章详细讲解了PyAV的安装过程,包括在Windows、Linux和ARM平台上的安装步骤,以及安装中可能遇到的错误和解决方法。此外,还解释了时间戳的概念,包括RTP、NTP、PTS和DTS,并提供了Python代码示例,展示如何获取RTSP流中的各种时间戳。最后,文章还提供了一些附录,包括Python通过NTP同步获取时间的方法和使用PyAV访问网络视频流的技巧。
129 4
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
|
29天前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
118 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
29天前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
118 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
24天前
|
存储 Python
在Python中,什么是作用域
【10月更文挑战第12天】在Python中,什么是作用域
11 2
|
28天前
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
55 1
|
28天前
|
Ubuntu Linux Python
Ubuntu学习笔记(六):ubuntu切换Anaconda和系统自带Python
本文介绍了在Ubuntu系统中切换Anaconda和系统自带Python的方法。方法1涉及编辑~/.bashrc和/etc/profile文件,更新Anaconda的路径。方法2提供了详细的步骤指导,帮助用户在Anaconda和系统自带Python之间进行切换。
69 1
|
1月前
|
索引 Python
Python学习笔记编程小哥令狐~持续更新、、、(上)
Python学习笔记编程小哥令狐~持续更新、、、(上)
50 2
|
1月前
|
存储 Python
Python学习笔记编程小哥令狐~持续更新、、、 (下)
Python学习笔记编程小哥令狐~持续更新、、、 (下)
30 1
|
1月前
|
存储 Python
【免费分享编程笔记】Python学习笔记(二)
【免费分享编程笔记】Python学习笔记(二)
40 0
【免费分享编程笔记】Python学习笔记(二)
|
1月前
|
Java 编译器 Go
Python学习笔记--- day01计算机基础和环境搭建(一)
Python学习笔记--- day01计算机基础和环境搭建(一)
下一篇
无影云桌面