質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1060閲覧

Python:変数の参照について

pythonsyosinsya

総合スコア11

Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/21 11:25

前提・実現したいこと

pythonエンジニア認定試験を受験する者です。
過去問で分からない点がありましたのでご質問させていただきます。
変数の参照について、locがそれぞれなぜその値が参照されるかが分かりません。
例えば、定義内でglobal locを宣言したのに、なぜ出力がnonlocalになるのでしょうか?
初歩的な質問で申し訳ありません。
ご教示よろしくお願いいたします。

該当のソースコード

python

1def scope(): 2 loc = "init" 3 def do_local(): 4 loc = "local" 5 def do_nonlocal(): 6 nonlocal loc 7 loc = "nonlocal" 8 def do_global(): 9 global loc 10 loc = "global" 11 do_local() 12 print(loc) 13 do_nonlocal() 14 print(loc) 15 do_global() 16 print(loc) 17 18scope() 19print(loc) 20#出力結果:init nonlocal nonlocal global 21#それぞれなぜこの値が参照されるのかが分かりません

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takutakuya

2020/10/21 11:36

3番目の出力が「nonlocal」となる理由が分からないということでしょうか?
guest

回答2

0

それぞれの loc がどの loc かわかるようにコメントを入れました。

Python

1def scope(): 2 loc = "init" # scope loc binding "init" 3 def do_local(): 4 loc = "local" # do_local loc binding "local" 5 def do_nonlocal(): 6 nonlocal loc 7 loc = "nonlocal" # scope loc binding "nonlocal" 8 def do_global(): 9 global loc 10 loc = "global" # global loc binding "global" 11 do_local() 12 print(loc) # print scope loc: "init" 13 do_nonlocal() 14 print(loc) # print scope loc: "nonlocal" 15 do_global() 16 print(loc) # print scope loc: "nonlocal" 17 18scope() 19print(loc) # print global loc: "global"

投稿2020/10/21 11:58

lehshell

総合スコア1147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

これ、あまり例がよくないですよね。

python

1loc = 'origin' # これを追加 2 3def scope(): 4 loc = "init" 5 def do_local(): 6 loc = "local" 7 def do_nonlocal(): 8 nonlocal loc 9 loc = "nonlocal" 10 def do_global(): 11 global loc 12 loc = "global" 13 do_local() 14 print(loc) # ★ 15 do_nonlocal() 16 print(loc) # ★ 17 do_global() 18 print(loc) # ★ 19 20print(loc) # ここでは、originと表示されるはず。 21scope() 22print(loc) # ここでは、globalになっているはず。

「nonlocal」は、その関数の1つ上のスコープ、この場合は、scope関数で定義されているlocを参照するのです。
また、★を付けたprintは、そのscope関数内のlocを表示する関数ですから、nonlocalとなります。

globalはどんな深いところにあるスコープからも、グローバルの=トップレベルの変数を参照しますので、最初にoriginになっていたものを指しています。

投稿2020/10/21 11:39

TakaiY

総合スコア12765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問