私はPython変数のスコープをかなりよく理解していたと思っていましたが、今日はこのコードを実行しました。奇妙なPythonのスコープの問題
from __future__ import print_function
def main():
v_Matrix =[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
print(v_Matrix)
print()
f_Rotate(v_Matrix)
print(v_Matrix)
hh = 3
f_This(hh)
print(hh)
def f_Swap(v_Matrix, r1, c1, r2, c2):
v_Matrix[r1][c1], v_Matrix[r2][c2] = v_Matrix[r2][c2], v_Matrix[r1][c1]
def f_Transpose(v_Matrix):
for row in range(len(v_Matrix)):
for col in range(row):
f_Swap(v_Matrix, row, col, col, row)
def f_FlipVertical(v_Matrix):
v_Size = len(v_Matrix)
for row in range(v_Size // 2):
for col in range(v_Size):
f_Swap(v_Matrix, row, col, v_Size - row - 1, col)
def f_Rotate(v_Matrix):
f_Transpose(v_Matrix)
f_FlipVertical(v_Matrix)
def f_This(hh):
hh = hh * 2
if __name__ == '__main__':
main()
実行すると、変数v_Matrix
はグローバルのように動作するようです。ただし、テスト変数hh
は、1つのスコープをmain()
に、もう1つをf_This
に設定して、期待どおりに動作します。
v_Matrix
はグローバルではなく、さまざまな機能で変更されていますが、これらの機能間を行き来することはなく、main()
にも戻ります。これらの機能でv_Matrix
に適用された値の変更は、出力の間に表示されるmain()
のスコープでアクセスできます。ただし、期待どおりに、は、機能の範囲内でのみ、のスコープ内で変更されません。
何がありますか?
リストは変更可能であるためです。詳細については、https://docs.python.org/2/reference/datamodel.html#objects-values-and-typesをご覧ください。 – Selcuk
Pythonは、オブジェクトのコピーを作成するのではなく、functionを呼び出すときに、変更可能なオブジェクトへのポインタをパラメータとして渡します。 Cスタイルのポインタと同様に、ポイントされているオブジェクトの内容を変更することはできますが、関数の呼び出し側が新しいオブジェクトを割り当てることでそのオブジェクトを指すことはできません。 –
@Selcukあなたのリンクのスコープについてはあまり言及されていません。しかし、あなたのコメントは、変更可能なオブジェクト、特にリストが "外側"、 "内側"のコンテナなどのスコープとは異なる振る舞いをするという事実を私が指摘する助けとなりました。 。私はスコープを研究したときにその事実を逃したと思います。ありがとう。 – JayJay123