Maison développement back-end Tutoriel Python Python 五点搞定作用域

Python 五点搞定作用域

Nov 07, 2016 am 10:43 AM

1、块级作用域

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

1

2

3

4

5

6

7

#块级作用域

if 1 == 1:

    name = "lzl"

print(name)

for i in range(10):

    age = i

print(age)

Copier après la connexion

我们先看下执行结果

1

2

3

4

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

lzl

9

 Process finished with exit code 0

Copier après la connexion

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

2、局部作用域

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

1

2

3

4

#局部作用域

def  func():

    name = "lzl"

print(name)

Copier après la connexion

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

1

2

3

4

Traceback (most recent call last):

  File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py", line 23, in <module>

    print(name)

NameError: name &#39;name&#39; is not defined

Copier après la connexion
Copier après la connexion

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

1

2

3

4

5

6

7

#局部作用域

   

def  func():

    name = "lzl"

   

func()          #执行函数

print(name)

Copier après la connexion

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

1

2

3

4

Traceback (most recent call last):

  File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py", line 23, in <module>

    print(name)

NameError: name &#39;name&#39; is not defined

Copier après la connexion
Copier après la connexion

执行依然报错,还是回到刚才那句话:即使执行了一下函数,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()

Copier après la connexion

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

4、终极版作用域

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

1

2

3

4

5

6

7

8

9

10

#终极版作用域

   

name = "lzl"

   

def f1():

    print(name)

   

def f2():

    name = "eric"

    f1()

Copier après la connexion

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

Copier après la connexion

执行结果为“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

#终极版作用域

   

name = "lzl"

   

def f1():

    print(name)

   

def f2():

    name = "eric"

    f1()

   

f2()

Copier après la connexion

# 输出:lzl

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

5、新浪面试题

1

li = [lambda :x for x in range(10)]

Copier après la connexion

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

1

2

3

4

5

print(type(li))

print(type(li[0]))

   

# <class &#39;list&#39;>

# <class &#39;function&#39;>

Copier après la connexion

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

#lambada 面试题

1

2

3

4

li = [lambda :x for x in range(10)]

   

res = li[0]()

print(res)

Copier après la connexion

#输出:9

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


Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment résoudre le problème des autorisations rencontré lors de la visualisation de la version Python dans le terminal Linux? Comment résoudre le problème des autorisations rencontré lors de la visualisation de la version Python dans le terminal Linux? Apr 01, 2025 pm 05:09 PM

Solution aux problèmes d'autorisation Lors de la visualisation de la version Python dans Linux Terminal Lorsque vous essayez d'afficher la version Python dans Linux Terminal, entrez Python ...

Comment copier efficacement la colonne entière d'une dataframe dans une autre dataframe avec différentes structures dans Python? Comment copier efficacement la colonne entière d'une dataframe dans une autre dataframe avec différentes structures dans Python? Apr 01, 2025 pm 11:15 PM

Lorsque vous utilisez la bibliothèque Pandas de Python, comment copier des colonnes entières entre deux frames de données avec différentes structures est un problème courant. Supposons que nous ayons deux dats ...

Dessin graphique de sablier Python: comment éviter les erreurs variables non définies? Dessin graphique de sablier Python: comment éviter les erreurs variables non définies? Apr 01, 2025 pm 06:27 PM

Précision avec Python: Source de sablier Dessin graphique et vérification d'entrée Cet article résoudra le problème de définition variable rencontré par un novice Python dans le programme de dessin graphique de sablier. Code...

Python multiplateform de bureau de bureau de bureau: quelle bibliothèque GUI est la meilleure pour vous? Python multiplateform de bureau de bureau de bureau: quelle bibliothèque GUI est la meilleure pour vous? Apr 01, 2025 pm 05:24 PM

Choix de la bibliothèque de développement d'applications de bureau multiplateforme Python De nombreux développeurs Python souhaitent développer des applications de bureau pouvant s'exécuter sur Windows et Linux Systems ...

Google et AWS fournissent-ils des sources publiques d'image PYPI? Google et AWS fournissent-ils des sources publiques d'image PYPI? Apr 01, 2025 pm 05:15 PM

De nombreux développeurs s'appuient sur PYPI (PythonPackageIndex) ...

Comment compter et trier efficacement de grands ensembles de données de produit dans Python? Comment compter et trier efficacement de grands ensembles de données de produit dans Python? Apr 01, 2025 pm 08:03 PM

Conversion et statistiques de données: traitement efficace des grands ensembles de données Cet article introduira en détail comment convertir une liste de données contenant des informations sur le produit en une autre contenant ...

Comment optimiser le traitement des images à haute résolution dans Python pour trouver des zones circulaires blanches précises? Comment optimiser le traitement des images à haute résolution dans Python pour trouver des zones circulaires blanches précises? Apr 01, 2025 pm 06:12 PM

Comment gérer les images haute résolution à Python pour trouver des zones blanches? Traitement d'une image haute résolution de 9000x7000 pixels, comment trouver avec précision deux de l'image ...

Comment résoudre le problème de l'encodage du nom de fichier lors de la connexion au serveur FTP dans Python? Comment résoudre le problème de l'encodage du nom de fichier lors de la connexion au serveur FTP dans Python? Apr 01, 2025 pm 06:21 PM

Lorsque vous utilisez Python pour se connecter à un serveur FTP, vous pouvez rencontrer des problèmes d'encodage lors de l'obtention de fichiers dans le répertoire spécifié et de les télécharger, en particulier du texte sur le serveur FTP ...

See all articles