1. ホーム
  2. python

[解決済み] Pythonの関数が参照で呼び出される

2022-12-14 18:28:02

質問

いくつかの言語では、以下のような特別な予約語を使って、パラメータを参照または値で渡すことができます。 参照 または val . Pythonの関数にパラメータを渡した場合、関数から離れるときにパラメータの値が変更されることはありません。 グローバル という予約語を使うしかありません(というか、私は現在そう理解しています)。

例 1:

k = 2

def foo (n):
     n = n * n     #clarity regarding comment below
     square = n
     return square

j = foo(k)
print j
print k

が表示されます。

>>4
>>2

はkが変化していないことを示す。

この例では、変数nは変更されません

例2:

n = 0
def foo():
    global n
    n = n * n
    return n

この例では、変数nが変更されています。

Pythonで関数を呼び出す方法はありますか? パラメータ のどちらかです。 または 参照 パラメータを使用する代わりに、global?

次に、ケンブリッジ大学のAレベルの試験で、関数が返すのは シングル 値を返すのに対し、プロシージャは 複数の の値を返します。80年代には、関数にはreturn文があり、プロシージャにはないと教わりました。なぜ今これが間違っているのでしょうか?

どのように解決するのですか?

のようなイミュータブルなオブジェクトを変更することはできません。 str または tuple のように、Pythonの関数内部で、でも、できる。

def foo(y):
  y[0] = y[0]**2

x = [5]
foo(x)
print x[0]  # prints 25

ただし、配列の特定の要素を常に二乗する必要がある場合を除けば、それは奇妙な方法です。

Pythonでは、複数の値を返すこともできるため、参照渡しのユースケースのいくつかはあまり重要でなくなることに注意してください。

def foo(x, y):
   return x**2, y**2

a = 2
b = 3
a, b = foo(a, b)  # a == 4; b == 9

このように値を返す場合、Tupleとして返され、それが順番に展開されます。

を編集してください。 このことについて考える別の方法は、Pythonで明示的に変数を参照渡しすることはできませんが、渡されたオブジェクトのプロパティを変更することは可能です。私の例では(そして他の例でも)、あなたは渡されたリストのメンバーを変更することができます。しかし、渡された変数を完全に再代入することはできません。例えば、次の2つのコードは、同じようなことをやっているように見えますが、異なる結果になっていることを確認してください。

def clear_a(x):
  x = []

def clear_b(x):
  while x: x.pop()

z = [1,2,3]
clear_a(z) # z will not be changed
clear_b(z) # z will be emptied