図形を描き、ポイントの位置の1つを記録する機能があります。ポイントが(2,1)であるとすると、x =(2,1)
メインでxを使用するにはどうすればよいですか?
def shape():
t.forward(10)
x = t.position()
t.goto(x)
どうすればそれを機能させることができますか?
メインプログラムのの値にアクセスするにx
は、関数から(経由でreturn x
)値を返します。この場合shape()
は、値を設定/変更します。
提示したコードは、(スコープ規則を除いても)単独では意味がありません。呼び出されたときに作成される関数を定義しますx
。次に、を使用しますx
。しかし、あなたは関数を呼び出したことがないので、x
存在すらしていません!他の場所で関数を呼び出した可能性がありますが、複数回呼び出した可能性があります。その場合、の多くのバージョンx
が存在する可能性があります。あなたはどれが欲しいですか?
そのため、関数外の関数で定義された変数を単純に参照することはできません。それはあなたを困らせるための単なる制限ではありません。概念としては意味がありません。
従うべき経験則は、関数の引数で情報を渡すことによって関数に情報を伝達し、それを返すことによって関数から呼び出し元に情報を伝達することです。これは、関数がおそらく次のようになることを意味します。
def shape(t):
t.forward(10)
return t.position
次に、次のようにします。
x = shape(t)
t.goto(x)
非ローカル変数としてアクセスできます(グローバルまたは外部関数スコープ。どちらを使用しているかは明確ではありません)。t
ただし、正当な理由がない限り、通常はそうしない方がよいでしょう。情報を明示的に渡すと、コードが読みやすくなり、変更がより分離され、複数のコンテキストで使用できる可能性が高くなります(結局のところ、関数を作成するポイントです)。返さずにアクセスすることはできませんx
(また、返すだけの場合は、関数内で名前を付けても意味がありません。他の誰もその名前を使用できないためです)。
グローバル変数(または他の非ローカル変数)を使用すると役立つ例外はたくさんありますが、それらを一般的な規則の例外と見なすと、一般的に生活が楽になるため、使用する場合は意図的にこれらの手法を使用します。あなたの習慣は、グローバルおよび非ローカルを避けることです。