関数は、関数内のみの関数呼び出しの内部では、関数?!外に呼び出すことはできません
理由:名前空間の問題!!!
ディアン名前空間
名前空間(ネームスペース):いつ章、我々は変数が実際にメモリに新たなスペースを開いている作成すると述べたメモリ管理。しかし、我々は、実際には、メモリ内の変数名と変数のメモリストレージ間の結合関係の余地がある、変数名を格納避けてきた、この空間は、名前空間と呼ばれています。
1.1ビルトイン名前空間
内蔵の名前空間:名前が付いていますストアPyhtonインタプリタは、そのようなint型、float型、LENとして
ライフサイクル:インタプリタを有効にするために始めたとき、インタプリタが閉じているときに、失敗
1.2グローバルネームスペース
グローバル・ネームスペース:内部およびローカル名に加えて、残りは次のコードのように、グローバルネームスペースに格納されている
x、func、l、z
ライフサイクル:ファイルが実行されるときに有効になり、ファイルは、実行後に期限切れ
x = 1
def func():
pass
l = [1, 2]
if 3 > 2:
if 4 > 3:
z = 3
1.3ローカル名前空間
ローカル名前空間:関数呼び出しの際に生成された格納するための関数本体の名前は、そのような次のコードF2など
ライフサイクル:ファイルが実行されると、関数呼び出しの際に有効になる機能の実行後に期限切れ
def f1():
def f2():
print('from f2')
f2()
f1()
1.4ロード順序
Pythonインタプリタでの名前空間のロードが完了した後に、それが構築されなければならないので、の.pyファイルは、Pythonインタプリタによって開かれているので、ファイルを開くために始めた、この時間は、グローバルな名前空間を演出しますが、特定の関数がファイルにあり - 「グローバル - 」ローカルビルトイン:呼び出されたとき、それはロード順序のローカル名前空間、名前空間を生成するために開始されます。
1.5の順序を探します
名前空間は、変数名と値の間の結合関係を格納するために使用されているので、あなたが名前を見つけたい時はいつでも、次の順序を探し、3の1に記載されていなければなりませんよう:
現在の場所ならば、現在の場所から見始めます- 「世界- 」建てローカル:ローカルネームスペースの場所は、次の順序を探します。
x = 1
y = 2
len = 100
def func():
y = 3
len = 1000
print(f"y: {y}")
print(f"len: {len}")
# print(a) # NameError: name 'a' is not defined
func()
y: 3 len: 1000
x = 1
def func():
print(x)
x = 10
func()
二ディアン範囲
ドメインは、すなわち作用領域範囲領域を指します。
2.1グローバルスコープ
グローバルスコープ:グローバル・効果的な、世界的な生存、および組み込みの名前空間のグローバルネームスペース。
# 全局作用域
x = 1
def bar():
print(x)
bar()
1
2.2ローカルスコープ
ローカルスコープ:ローカル小さな、一時保管、唯一のローカルな名前空間を含みます。
# 局部作用域
def f1():
def f2():
def f3():
print(x)
x = 2
f3()
f2()
f1()
2
2.3 注意点
なお:関数定義ステージ固定金型との間の関係の範囲に関係なく、関数の呼ばれました。
# 作用域注意点
x = 1
def f1(): # 定义阶段x=1
print(x)
def f2():
x = 2
f1()
f2()
1
スコープの関数オブジェクトの2.4応用+
# 作用域应用
def f1():
def inner():
print('from inner')
return inner
f = f1() # 把局部定义的函数放在全局之中
def bar():
f()
bar()
from inner
水とサプリメントの知識
3.1グローバルキーワード
グローバルスコープ内の変数を変更します。
x = 1
def f1():
x = 2
def f2():
# global x # 修改全局
x = 3
f2()
f1()
print(x)
1
x = 1
def f1():
x = 2
def f2():
global x # 修改全局
x = 3
f2()
f1()
print(x)
3
3.2非ローカルキーワード
変数にローカルスコープを変更します。
x = 1
def f1():
x = 2
def f2():
# nonlocal x
x = 3
f2()
print(x)
f1()
2
x = 1
def f1():
x = 2
def f2():
nonlocal x
x = 3
f2()
print(x)
f1()
3
3.3 注意点
地元1.任意のステートメントを直接変更することができます必要としない、グローバル変数の型を変更したいです。
2.ローカル不変タイプのあなたは、世界的なステートメントを使用する必要性をグローバル変更したい場合は、グローバル変数を直接変更することができますように、宣言しました。
lis = []
def f1():
lis.append(1)
print(f"调用函数前: {lis}")
f1()
print(f"调用函数后: {lis}")
调用函数前: [] 调用函数后: [1]