Pythonを使用して、Aレベルの学生に参照による呼び出しと値による呼び出しの違いを説明するプログラムを作成しようとしています。変更可能なオブジェクトを変数として関数に渡すことで成功しましたが、ctypes ライブラリを使用しても同じことができることがわかりました。
byref()
ctype ライブラリに関数があるのでよくわかりませんが、私の例ではうまくいきませんでした。しかし、それなしbyref()
で関数を呼び出すことでうまくいきました!
私の作業コード:
"""
Program to illustrate call by ref
"""
from ctypes import * #allows call by ref
test = c_int(56) #Python call by reference eg address
t = 67 #Python call by value eg copy
#expects a ctypes argument
def byRefExample(x):
x.value= x.value + 2
#expects a normal Python variable
def byValueExample(x):
x = x + 2
if __name__ == "__main__":
print "Before call test is",test
byRefExample(test)
print "After call test is",test
print "Before call t is",t
byValueExample(t)
print "After call t is",t
質問
通常の Python 変数を渡すと、byValueExample()
期待どおりに機能します。関数の引数のコピーはt
変更されますが、ヘッダー内の変数は変更t
されません。ただし、ctypes 変数テストを渡すと、ローカル変数とヘッダー変数の両方が変更されるため、C ポインター変数のように動作します。私のプログラムは機能しますが、次のbyref()
ように使用すると関数が機能しない方法と理由がわかりません。
byRefExample(byref(test))