関数の引数を渡すオブジェクトスタイルによるPythonの呼び出しの概念を理解しているかどうかはわかりません(ここで説明されていますhttp://effbot.org/zone/call-by-object.htm)。この概念を明確にするのに十分な例がないようです(または私のgoogle-fuはおそらく弱いです!:D)
この概念を理解するために、この少し工夫されたPythonプログラムを作成しました
def foo( itnumber, ittuple, itlist, itdict ):
itnumber +=1
print id(itnumber) , itnumber
print id(ittuple) , ittuple
itlist.append(3.4)
print id(itlist) , itlist
itdict['mary'] = 2.3
print id(itdict), itdict
# Initialize a number, a tuple, a list and a dictionary
tnumber = 1
print id( tnumber ), tnumber
ttuple = (1, 2, 3)
print id( ttuple ) , ttuple
tlist = [1, 2, 3]
print id( tlist ) , tlist
tdict = tel = {'jack': 4098, 'sape': 4139}
print '-------'
# Invoke a function and test it
foo(tnumber, ttuple, tlist , tdict)
print '-------'
#Test behaviour after the function call is over
print id(tnumber) , tnumber
print id(ttuple) , ttuple
print id(tlist) , tlist
print id(tdict), tdict
プログラムの出力は次のとおりです。
146739376 1
3075201660 (1, 2, 3)
3075103916 [1, 2, 3]
3075193004 {'sape': 4139, 'jack': 4098}
---------
146739364 2
3075201660 (1, 2, 3)
3075103916 [1, 2, 3, 3.4]
3075193004 {'sape': 4139, 'jack': 4098, 'mary': 2.3}
---------
146739376 1
3075201660 (1, 2, 3)
3075103916 [1, 2, 3, 3.4]
3075193004 {'sape': 4139, 'jack': 4098, 'mary': 2.3}
ご覧のとおり、渡された整数を除いて、オブジェクトID(私が理解しているようにメモリの場所を参照しています)は変更されません。
したがって、整数の場合、それは(効果的に)値によって渡され、他のデータ構造は(効果的に)参照によって渡されました。リスト、番号、辞書を変更して、データ構造が変更されたかどうかをテストしてみました。数はリストではなく、辞書はありました。
上記のコードで渡されたデータ構造に応じて、引数の受け渡しの「オブジェクトによる呼び出し」スタイルは双方向で動作するように見えるため、上記の単語を効果的に使用します
より複雑なデータ構造(たとえば、numpy配列など)の場合、参照によって渡される引数と値によって渡される引数を認識するための簡単な経験則はありますか?