-1

Python で関数にパラメーターを渡すための 2 つのコードがあります。1-

def changeme( mylist ):
   mylist.append([1,2,3,4]);
   print "Values inside the function: ", mylist
   return

mylist = [10,20,30];
changeme( mylist );
print "Values outside the function: ", mylist

2-

def changeme( mylist ):
   mylist = [1,2,3,4]; 
   print "Values inside the function: ", mylist
   return

mylist = [10,20,30];
changeme( mylist );
print "Values outside the function: ", mylist

なぜ最初のコードでは mylist が参照によって渡され、2 番目のコードでは値によって渡されるのでしょうか?

4

5 に答える 5

3

最初の例では、渡されたリストに情報を追加します。2 番目の例では、mylist返す前にローカル値を再割り当てします。二人は同じことをしているわけではありません。

于 2012-08-15T18:01:38.763 に答える
2

Python での割り当ては、左側にあるオブジェクトでは機能しないことに注意してください。割り当ては、右側のオブジェクトへの新しい参照を作成し、その参照を左側の名前に格納します。したがって、最初の例では、入力したリストを変更し、後でその変更を確認します。2 番目の例では、関数内でリスト (右側で作成される) への新しい参照を作成し、それをローカル (関数への) variable にバインドしますmylist。したがってmylist、関数に入力したオブジェクトを参照しなくなります。

于 2012-08-15T18:05:30.603 に答える
1

これは、関数 2 で mylist を他のオブジェクトに割り当てたためです。

Python では、変更可能なオブジェクトを関数に渡す場合は参照渡しと呼ばれ、不変オブジェクトを渡す場合は値渡しと呼ばれます。

mylist = [1,2,3,4]


def changeme( mylist ):
   print (id(mylist))  #prints 180902348

   #at this point the local variable mylist points to [10,20,30] 
   mylist = [1,2,3,4];  #this reassignment changes the local mylist, 

   #now local mylist points to [1,2,3,4], while global mylist still points to [10,20,30] 
   print (id(mylist)) #prints 180938508 #it means both are different objects now 

   print ("Values inside the function: ", mylist)
   return

mylist = [10,20,30];
changeme( mylist );
print ("Values outside the function: ", mylist)

最初の1つ:

def changeme( mylist ):
   print (id(mylist))      #prints 180902348

   mylist.append([1,2,3,4]);  #by this it mean [10,20,30].append([1,2,3,4])
   #mylist is just a label pointing to [10,20,30]
   print (id(mylist))       #prints 180902348  , both point to same object
   print ("Values inside the function: ", mylist)
   return

mylist = [10,20,30];
changeme( mylist );
print ("Values outside the function: ", mylist)
于 2012-08-15T18:01:58.733 に答える
1

オブジェクトを変更することと、別のオブジェクトに名前を再割り当てすることには違いがあります。コードを単純に変更すると、元のオブジェクトが変更されるため、一貫して動作します。

def changeme( mylist ):
   mylist[:] = [1,2,3,4]; 
   print "Values inside the function: ", mylist

PSreturn値を返さない限り、関数の最後に a は必要ありません。

于 2012-08-15T18:07:46.113 に答える
-1

Python には値渡しのセマンティクスがあります。いつも。オブジェクトは Python の値ではありません。言語のすべての値は参照 (別名ポインター) です。オブジェクトは常に参照を通じて操作されます。人々はこれに対してさまざまな名前を思いつきますが、彼らがそれを何と呼ぶにせよ、彼らが説明していることはオブジェクト参照の値渡しと意味的に同等です。

渡すか代入するたびに、値 (参照) がコピーされます。これは、呼び出された関数が引数の独自のコピー (参照) を持っていることを意味します。したがって、この変数に代入しても、呼び出し元には影響しません。一度もない。

最初のコードでは、パラメーターに割り当てていません。代わりに、それが指すオブジェクトの参照を介してメソッドを呼び出しています。このメソッドはオブジェクトを変更します。したがって、もちろん、同じオブジェクトを指す参照を持っている他の人は誰でもそれを見ることができます。

于 2012-08-15T18:45:32.223 に答える