パイソン一次変数の高度な使用、詳細な分析と説明〜


序文

Pythonの基本を深く理解し、最も基本的な知識を使用してインタビュアーを平手打ちします。


変数のスコープ

1.変数のスコープは何ですか?

Pythonプログラムで変数名を作成、変更、および検索する場合、これらはすべて、変数名を保持するスペースで実行されます。これは命名空间、と呼ばれ、とも呼ばれ作用域ます。

Python的作用域是静态的、変数名が割り当てられているソースコード内の場所が決定され该变量能被访问的范围ます。つまり、Python変数のスコープは、変数所在源代码中的位置によって決定されます。

2.スコープの生成

変数がモジュール(モジュール)クラス(クラス)デフ関数)で定義されている場合にのみ、スコープの概念があります。

スコープで定義された変数は、通常、そのスコープでのみ有効です。

、、などif-elif-elseキーワードを含むステートメントブロックfor-elsewhiletry-except / try-finally并不会产生作用域

2.1。コード分析

まず、関数で変数番号を定義します。

def func():
	number = 100
	print(number)


print(number)

関数を実行すると、エラーが発生します。ERROR:NameError:name'number' is not defined
ここに画像の説明を挿入
上記は関数です。条件内でコードを定義して、数値を定義します。


if True:
    number = 100
    print(number)
print("******输出分隔符******")
print(number)

このコードを実行した結果:この場合はスコープがありますが、条件付きデモにはスコープ
ここに画像の説明を挿入
がないと結論付けることができます。
def函数if

3.範囲の種類(LEGB法)

L(ローカル):ローカルスコープ(関数内の名前空間)

E(囲み)ネストされたスコープ(外側のネストされた関数の名前空間)

G(グローバル)グローバルスコープ(モジュール(ファイル)が配置されている名前空間)

B(組み込み)組み込みスコープ(Pythonの組み込みモジュールの名前空間)

3.1。コード分析

globalVar = 100  # 全局作用域 (既然是全局就代表任何地方可用)


def nest_scope():
    enclosingVar = 200  # 嵌套作用域(可在嵌套函数中使用)

    def func():
        localVar = enclosingVar + 1  # 局部作用域(只能在当前函数func 使用)
        print(localVar)
    return func()


print(__name__)  # 内置作用域

3.2。(LEGBルール)変数名の検索の優先順位

関数で未確定の変数名が使用されている場合、Pythonは優先度の高い順に4つのスコープを検索して、変数名の意味を判別します。
まず、ローカルスコープ(L)を検索します。

前のネストされた構造のdefまたはlambda関数のネストされたスコープ( E)が続きます。

続いてグローバルスコープ(G)、

最後に、組み込みのスコープ(B)があります。

この検索原理に従って、最初に見つかった場所で停止します。見つからない場合は、NameErrorエラーが発生します。

3.2.1。変数名の検索の優先順位

局部作用域 >>> 嵌套作用域 _ 全局作用域 _ 内置作用域

3.2.2。コード分析

|-------------------------------------示例1--------------------------------------|
def func():
    number = 256
    print(number)  # 输出局部作用域的number 
 
 
number = 1024
func()
print(number) # 输出全局作用域的number 

运行结果:
256
1024

|-------------------------------------示例2--------------------------------------|
def nest_scope():
    number = 256
    print(number)

    def func():
        print(number)  # 此处输出的是上层嵌套函数nest_scope()中的number

    func()


number = 1024
nest_scope()
print(number)


运行结果:
256
256 
1024
|-------------------------------------示例3--------------------------------------|
number = 1024
def func():
    print(number)  # 此处的变量number对应的肯定是下一行中所声明的局部变量, 但是未被赋值之前引用了所以会报错
    number = 256


func()
print(number)


运行结果:
UnboundLocalError: local variable 'number' referenced before assignment

|-------------------------------------示例4--------------------------------------|
number = 1024
def func():
    print(number)
    # number = 256  # 此行定义的局部变量被注释掉之后, 上一行所对应的应该是全局变量中的number


func()
print(number)


运行结果:
1024
1024

上記のコードは、LEGB法の優先順位の結論を明確に引き出すことができます。

次に、グローバルキーワードと非ローカルキーワードの違い

1. globalは、関数内のグローバル変数の値を変更するのに適しています

number = 1024


def test_update_number():
    def nested_func():
        global number  # 绑定到了第一行定义的number
        print('current_number=', number)  # 输出当前number的值
        number = 200

    return nested_func()


test_update_number()
print(number)  # 输出修改后的值

输出结果:
current_number= 1024
200

2. nonlocalは、外部変数の値を変更するための入れ子関数の内部関数に適しています

def func_outer():
    number = 10

    def func_inner():
        nonlocal number  # 绑定到了第二行定义的number
        print("current_number=", number)  # 未被修改之前的值
        number = 20
        print(number)  # 内层输出修改后的值

    func_inner()
    print(number)  # 外层输出修改后的值


func_outer()

 输出结果:
current_number= 10
20
20

これから、それらの違いと正しい使用法を見ることができます。


要約する

基本的な知識の分類も非常に重要であり、日常の開発プロセスや面接プロセスで使用されます。今日の共有は終了しました。訂正していただければ幸いです。

おすすめ

転載: blog.csdn.net/Return_Li/article/details/119854896