web-dev-qa-db-ja.com

Python:関数間で変数を渡す

過去数時間、ここや他の場所を読んだり、実験したりしましたが、異なる関数間で値を(変数として)渡すという非常に基本的な概念であると確信していることを本当に理解していません。

たとえば、ある関数のリストに値の束全体を割り当て、後でそのリストを別の関数で使用したい場合:

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. 空のリストとして「リスト」を初期化します。 mainを呼び出します(これは、少なくとも、私は正しいことを知っています...)
  2. DefineAList()内で、特定の値をリストに割り当てます。次に、新しいリストをmain()に戻します
  3. Main()内でuseTheList(list)を呼び出します
  4. 「list」はuseTheList関数のパラメーターに含まれているため、useTheListは、mainを呼び出す前に定義された空のリストではなく、defineAList()で定義されたリストを使用するようになります。

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

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

それで、「return」は明らかに私が思っていることをしないか、少なくとも私が思っているようにはしないので...実際に何をするのでしょうか?この例を使用して、defineAList()からリストを取得し、useTheList()内で使用するために何をしなければならないのかを教えてください。私はそれらが起こっているのを見ると物事をよりよく理解する傾向がありますが、私が見た適切な引数の受け渡しの例の多くは、まだ慣れていないコードを使用し、何が起こっているのかを把握する過程で、この概念を実際に理解していない。 2.7を使用しています。

ETA-過去に、同様の質問をして、ローカルだけでなくグローバル変数を使用することが提案されました。ここで関連がある場合-私が取っているクラスの目的のために、グローバルを使用することは許可されていません。

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

34
user2113818

これは実際に起こっていることです:

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()) 
37
Pavel Anossov

あなたはただ一つの重要なステップを見逃しています。明示的に戻り値を2番目の関数に渡す必要があります。

def main():
    l = defineAList()
    useTheList(l)

代わりに:

def main():
    useTheList(defineAList())

または(これを行うべきではありませんが、最初はいいように思えるかもしれませんが、グローバルは長期的には悲しみを引き起こすだけです。):

l = []

def defineAList():
    global l
    l.extend(['1','2','3'])

def main():
    global l
    defineAList()
    useTheList(l)

この関数は値を返しますが、コードで想定されているように、グローバルな名前空間でシンボルを作成しません。実際に呼び出しスコープで戻り値をキャプチャし、その後の操作に使用する必要があります。

9
Silas Ray

あなたがそれを割り当てなければあなたのリターンは役に立たない

list=defineAList()
3
bobrobbob

名前空間の概念を読んでください。関数で変数を割り当てる場合、この関数の名前空間でのみ変数を割り当てます。しかし、明らかに、すべての機能間で使用したいです。

def defineAList():
    #list = ['1','2','3'] this creates a new list, named list in the current namespace.
    #same name, different list!

    list.extend['1', '2', '3', '4'] #this uses a method of the existing list, which is in an outer namespace
    print "For checking purposes: in defineAList, list is",list
    return list

または、次のように渡すことができます。

def main():
    new_list = defineAList()
    useTheList(new_list)
2
Benjamin

ある関数から他の関数​​への引数として変数を渡すことは、このように行うことができます

このような関数を定義する

def function1():
global a
a=input("Enter any number\t")

def function2(argument):
print ("this is the entered number - ",argument)

このような関数を呼び出す

function1()
function2(a)
1
Pb Studies

returnは値を返します。その値にどのような名前を付けたかは関係ありません。それを返すことは、他の誰かがそれを使用できるように、単に「渡す」だけです。使用する場合は、外部から取得する必要があります。

lst = defineAList()
useTheList(lst)

listの中からdefineAListを返すことは、「プログラムの残り全体がその変数を使用できるようにする」ことを意味しません。これは、「この変数を渡して、プログラムの残りの部分にそれをつかんで使用する機会を与える」ことを意味します。その値を使用するには、その値を関数外の何かに割り当てる必要があります。また、このため、list = []を使用して事前にリストを定義する必要はありません。 defineAList内で、新しいリストを作成して返します。このリストは、最初にlist = []で定義したリストとは関係がありません。

ちなみに、変数名をlistからlstに変更しました。 listを変数名として使用することはお勧めできません。これは既に組み込みのPython型の名前であるためです。 listという独自の変数を作成すると、組み込みの変数にアクセスできなくなります。

1
BrenBarn