Pythonの関数パラメータ伝達:伝値?引用?

3435 ワード


http://blog.csdn.net/winterttr/article/details/2590741
作者:wintterTTr(転載は明記してください)
このタイトルは初心者の問題が多いと思います.特に私のようにC/C++に詳しいです.python殿堂に入ったばかりの友達たち.
.C/C++の関数パラメータの伝达方式の根强い影响は、私たちの考えである参照?送信値?一体そんなものですか?
へへ,言語の特性は使用方法を決定しました.じゃ、今はpythonの関数パラメータ伝達方式を探究します.
始まる前に、私達はpythonのいくつかの基礎概念をはっきり区別する必要があります.
まず、変数とオブジェクト
pythonでは、タイプは対象に属していますが、変数にはタイプがありません.これはpythonの言語特性であり、多くのpythonerを引きつけている点です.すべての変数は、メモリの中のオブジェクトの「参照」であると理解できます.あるいは、cのvoid*のように見えます.だから、python変数を見たとき、変数と本当のメモリオブジェクトを分離してほしいです.
タイプはオブジェクトに属します.変数ではありません.これで、多くの問題が考えやすくなります.
たとえば: 
1 nfoo = 1   #    int     nfoo(    ,nfoo    )

2 

3 lstFoo = [1]   #    list   lstFoo,  list       1。
 
前の概念に対応して、他の概念を引き出す必要があります.これは「変更可能」と「変更不可」のオブジェクトです.
pythonに詳しい人はこの事実を知るべきです.pythonではstings、tuples、numbersは変更できない対象です.list、dictなどは修正できる対象です.これらのいわゆる変更可能性と変更不可能性は何に影響していますか?
上の例です.
nfoo=2        
このとき、メモリの元の1オブジェクトは変更できないため、「破棄」され、他のnfooは新しいintオブジェクトを指し、その値は2です.
lst Foo[0]=2  
リストの最初の要素の値を変更します.リストは変更可能ですので、最初の要素は2に変更されます.実は、lstFooが指すオブジェクトの最初の値に新しいintオブジェクトが指定されています.これがvoid*のように見える変数の指す対象は、依然として先のオブジェクトであり、intオブジェクトがあるリストです.(聞いていて少しめまいがします.よく考えれば分かります.えっと.)
はい、私がこのように鴨を埋めたようにpythonの基礎知識を復習されました.テーマの問題を変えました.Pythonの関数パラメータ伝達:伝値?引用
変数(オブジェクトに対する概念)については、python関数のパラメータ伝達は変数転送値操作として理解できます.  =_= )
次に例を話します.
def ChangeInt( a ): a = 10  # change the number

 nfoo = 2 ChangeInt(nfoo) print nfoo #   2
 
この時何が起きましたか?オブジェクト2と、それを指す変数nfooがあります.Change Intに伝達されると、変数nfooの値が伝達値に従ってコピーされます.これにより、aはnfooが同じIntオブジェクトを指しています.関数のa=10の場合、何が発生しますか?
(上記の概念を覚えていますか?)intは変更できない対象です.そこで、新しいintオブジェクトを作って、他のaがそれを指しています.(ただし、変数nfooによって指しているオブジェクトは変化していません.)そこで外の感覚は関数がnfooの値を変えていないので、C++のように見えます.
def ChangeList( a ): a[0] = 10  # change the number

 lstFoo = [2] ChangeList(lstFoo ) print nfoo #   [10]
 
ChangeListに渡されると、変数は相変わらず「伝値」として変数lstFooの値をコピーし、aとlstFooは同じオブジェクトを指すが、listは変更可能なオブジェクトであり、a[0]に対する操作は、lstFooが指すオブジェクトの内容の操作である.=10とは、lstFooが指すオブジェクトの最初の要素を変更したため、再度lstFooを出力すると、[10]が表示され、内容が変更され、C++のように参照によって伝達されます.
えっと、今はpythonの変数と対象の概念をもっと深く理解しましたか?
上記の説明を通して、他のタイプの相手の伝達問題も自分で解決できると思います.