ホームページ  >  記事  >  バックエンド開発  >  Pythonの範囲をわかりやすく理解するための5つの知識を詳しく解説

Pythonの範囲をわかりやすく理解するための5つの知識を詳しく解説

高洛峰
高洛峰オリジナル
2017-03-28 15:09:571275ブラウズ

インターネット上には Python の範囲についての紹介がたくさんあります。そのため、今日私が皆さんに共有する記事は、Python の範囲を簡単に理解するためにこれらの 5 つの知識ポイントを学習できるようにするものです。

">

1. ブロックレベルスコープ

考えてみて、この時に次のプログラムを実行したら出力はあるでしょうか?実行は成功しますか?

#ブロックレベルスコープ

if 1 == 1:
name = "lzl"

print(name)


for i in range(10):
age = i

print(age)

まずは実行結果を見てみましょう

C:/Users/L/PycharmProjects/ s14/preview/Day8/scope/main.py
lzl
9

プロセスは終了コード 0 で終了しました

コードは Java/C# で問題なく実行され、上記のコードは name を要求しますが、age は定義されていません。ただし、Python では正常に実行できます。これは、コード ブロック内の変数を外部から呼び出すことができるためです。

2. ローカル スコープ

関数について学んだとき、関数は別のスコープでした。しかし、次のコードを見てください。ローカル スコープがあります。 #localscope

def func():
name = "lzl"

print(name)

このコードを実行して、何か出力があるかどうか疑問に思いますか?

Traceback (most last call last):

File "C :/Users/L/PycharmProjects/s14/review/Day8/scope/main.py"、 の 23 行目

print(name)
NameError: name 'name' が定義されていません

実行エラー、私誰もがこれを理解できると信じて、変数に名前を付けます。これは func() 関数内でのみ有効なので、上記のコードを簡単に調整して結果を確認することはできません。

#ローカル スコープ

def func ():
name = "lzl"

func() #関数の実行
print(name)

変数名を出力する前に、この時点で関数が実行されます。

トレースバック? (最後の呼び出し):

ファイル "C:/Users/L/PycharmProjects/s14/preview/Day8/scope/main.py"、 の 23 行目

print(name) )
NameError: name 'name' が定義されていません

実行してもエラーが報告されます。先ほどの文に戻りましょう: 関数が実行されたとしても、name のスコープは関数内のみであり、まだ実行できません外部から呼び出される; 最初の 2 つの知識ポイントを覚えておいてください。次に、トリック

3 の拡張を開始します。関数を調整して、次のコードの実行結果を確認します。

#スコープチェーン

name = "lzl"

def f1():

name = "Eric"
def f2():
name = "Snor"
print(name)
f2()
f1()

関数を勉強したことがある人なら、f1() が実行された後に Snor が出力されることを知っているはずです。まず、Python にはスコープチェーンがあり、変数は内側から外側に向かって検索されます。持っていない場合は、エラーが見つからなくなるまで上司に行って探してください

4. Ultimate Edition のスコープ

さて、準備は十分です。 、究極版はこちらです~~

#ULTIMATE Edition スコープ

name = "lzl"

def f1():
print(name)

def f2():
name = "eric"
f1()

f2()

f2() が "lzl" を出力する最終的な実行結果を考えてみましょう。それとも "eric" を出力しますか?今は答えを投稿しないでください:

#ULTIMATE SCOPE

name = "lzl"

def f1():
print(name)
def f2() :
name = "eric"
return f1

ret = f2()
ret()

#Output: lzl

実行結果は "lzl" で、上記のコードを分析して、f2() を実行すると、結果は関数 f1 のメモリアドレス、つまり ret=f1; ret() を実行することは、f1() を実行することと同じであり、f2() と f1() は関係ありません。チェーンが同じスコープ内にある場合、関数内に変数がない場合は外側を参照するため、このときの変数名の値は「lzl」になります。これを理解すれば、最終的なコードの答えもわかります。今答えを与えていないことを

#ULTIMATE SCOPE

name = "lzl"

def f1():

print(name)

def f2():
name = "eric"
f1( )

f2()

# 出力: lzl

はい、出力は「lzl」です。関数が実行される前にスコープが形成され、スコープチェーンも生成されていることを覚えておいてください

5. Sina のインタビューの質問

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

李のタイプを決定しますか? li の要素はどのような型ですか?

print(type(li))
print(type(li[0]))

#
#

li がlist 型の場合、リスト内の要素は関数であり、リスト内の最初の要素の戻り値を出力します。このときの戻り値は何ですか?

#lambada面接の質問

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

res = li[0]()
print(res)

#Output: 9

liFirst関数の戻り値of 9 は 0 ではありません。覚えておいてください: 関数が実行される前に内部コードは実行されません。ブログ内のコードを自分で練習して、印象を深めることができます

概要

上記がこの記事の全内容です。皆さんの勉強や仕事に役立つかどうかはわかりませんが、ご質問がございましたら、メッセージを残してください。

以上がPythonの範囲をわかりやすく理解するための5つの知識を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。