1. ホーム
  2. python

[解決済み] Python 関数間の変数の受け渡し

2022-02-11 19:21:07

質問

この数時間、ここや他の場所を読み漁り、実験もしましたが、非常に基本的な概念であるはずの、異なる関数間での値(変数)の受け渡しについて、よく理解できていないのです。

例えば、ある関数でリストに大量の値を代入し、後でそのリストを別の関数で使いたいとします。

list = []

def defineAList():
    list = ['1','2','3']
    print "For checking purposes: in defineAList, list is",list
    return list

def useTheList(list):
    print "For checking purposes: in useTheList, list is",list

def main():
    defineAList()
    useTheList(list)

main()

関数の引数が何をするかという私の理解に基づいて、私はこれが次のように行われることを期待します。

  1. list'を空リストとして初期化し、mainを呼び出す(これは、少なくとも、私が正しく理解していることは分かっている...)。
  2. defineAList() の中で、ある値をリストに代入し、新しいリストを main() に戻します。
  3. main() 内で useTheList(list) を呼び出す。
  4. list' は useTheList 関数のパラメータに含まれているので、useTheList は defineAList() で定義されたリストを使うのであって、main を呼ぶ前に定義された空のリストを使うのではないでしょう。

しかし、これは明らかに誤った理解です。私の出力は

For checking purposes: in defineAList, list is ['1', '2', '3']
For checking purposes: in useTheList, list is []

では、"return"は明らかに私が考えているようなことはしないし、少なくとも私が考えるようなことはしないので、実際にはどうなのでしょうか。この例を使って、defineAList()からリストを取り出し、useTheList()の中でそれを使用するために何をしなければならないか、教えていただけませんか?私は物事が起こっているのを見るとよりよく理解する傾向がありますが、私が見た適切な引数渡しの例の多くは、私がまだよく知らないコードも使用しており、何が起こっているかを理解する過程で、私はこの概念を本当に理解できていません。私は2.7を使っています。

ETA- 過去に同じような質問をしたとき、ローカル変数の代わりにグローバル変数を使用するよう提案されました。また、私が受講しているクラスでは、グローバルを使用することは許可されていません。

ありがとうございました。

解決方法は?

実際に起きているのはこのようなことです。

global_list = []

def defineAList():
    local_list = ['1','2','3']
    print "For checking purposes: in defineAList, list is", local_list 
    return local_list 

def useTheList(passed_list):
    print "For checking purposes: in useTheList, list is", passed_list

def main():
    # returned list is ignored
    returned_list = defineAList()   

    # passed_list inside useTheList is set to global_list
    useTheList(global_list) 

main()

これがあなたの望みです。

def defineAList():
    local_list = ['1','2','3']
    print "For checking purposes: in defineAList, list is", local_list 
    return local_list 

def useTheList(passed_list):
    print "For checking purposes: in useTheList, list is", passed_list

def main():
    # returned list is ignored
    returned_list = defineAList()   

    # passed_list inside useTheList is set to what is returned from defineAList
    useTheList(returned_list) 

main()

を省略することもできます。 returned_list に直接渡し、返された値を useTheList :

def main():
    # passed_list inside useTheList is set to what is returned from defineAList
    useTheList(defineAList())