プロが教える店舗&オフィスのセキュリティ対策術

よろしくお願いします。python初心者です。
テキストで下記のような文があったのですが、どうしてこのような結果になるのかがわかりません。
教えて頂けないでしょうか。

===============================
i = 3
i = 8

def f(abc = i):
i = 5

print(abc)

i = 4

i = 10

f()

→f() の結果 8

最後から2番目の行で、関数fの引数は i=10なので、10二はならないのでしょうか。
google colabを使って行ないました。

教えてください、よろしくお願いします。

A 回答 (5件)

あるあるですね。



python では変数 は値の入れ物ではなく
オブジェクトの参照を保持すると考えて下さい。

i=8

というのは値が8の整数オブジェクトが作られ、その「参照」が
iに代入されます。iに整数オブジェクトが代入されるのでは無いのです。

参照はcのポインタのようなものです。

def f(abc=i):

では、関数fの引数abcの既定値として
値が8の整数オブジェクトの「参照」が渡されます。
変数iが既定値になるわけでは有りません。
defで関数を定義した瞬間にiが保持していたオブジェクトの参照が
abcの既定値になるのです。

従って、パラメータ無しでfを呼び出せば
abcに値が8の整数オブジェクトの参照がセットされます。

因みに 関数定義 の後で、iの値を変えてますが、
これは新しい整数オブジェクトが作られ、その参照が
iに代入されます。しかしこれは、関数fの動きには
全く影響を与えません。fはiのことなど全く知らないのです。

また、関数内のローカル変数iは、同名のグロ―バル変数i
とは全く別物です。
    • good
    • 0
この回答へのお礼

わかりやすい回答ありがとうございました。
勉強し直します。

お礼日時:2021/11/28 17:38

しかし、トップレベルの実行と、関数定義が交差する


という処理の流れは python を含め少数の言語しか
できないので、

簡単な文かといわれると、そうでもない気がする。

普通の言語では、オプションパラメータの初期値に
コンスタントではない普通の式は書けないが、
pythonでは「いつ評価された」値なのか
意識する必要がある(^^;
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2021/12/01 21:30

まず、ここに投稿するときは、先頭の空白を、全角スペースとか別な文字(□とか)の置き換えてください。


空白がまとめられてしまうため、プログラム構造がわからなくなってしまいます。

たぶん、
def f(abc = i):
□i = 5
□print(abc)
だと思うので。

間違い:
def f(abc = i):
 関数fを定義
  引数が1つ: abc 省略可能。省略時は「変数i」
f()→ 引数が省略されているので、f(i) と同じ
 → i=10なので、10と出力

正解:
def f(abc = i):
 関数fを定義
  引数が1つ: abc 省略可能。省略時は「この時点での変数iの値、つまり8」
f()→ 引数が省略されているので、f(8) と同じ
 → 8と出力



ついでに
def f(abc = i):
□i = 5 # 関数fでのローカル変数。他のiとは別扱い
□print(abc)
    • good
    • 0
この回答へのお礼

回答で記載頂いているとおりです。
関数内のインデントがわかるように記載すべきでした。

グローバル変数とローカル変数のついて理解が出来ていないと理解しました。

最初の

i = 8

はグローバル変数で、関数 f () に引数を与えないときは、i = 8が最優先されるため、

f () の実行結果は8になるのだと理解しました。

お礼日時:2021/11/28 17:37

f() の結果、つまり関数fの値。


関数の引数じゃ無くて、関数って自分で言ってるでしょ?
何をする関数なのかを言わずに、誰がわかるのでしょうね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2021/11/28 17:32

おはようございます。



pythonは、分かりませんが、たぶん下記だと思います。
関係のある部分を抜粋。

i = 8
def f(abc = i) : ここで、abcが8となる。

print(abc) : ここで、abcの8を出力している。

だからかと。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2021/11/28 17:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!