投稿/コメントを表示します。

伊久間博之さんの投稿

(投稿ID: 5404)

pythonの仮引数はVBAにおける参照渡しなのでしょうか? また、pythonにはVBAでいうところの値渡しはないという理解でよいでしょうか?

以下のようなコードを書いて確認してみました。
def func(arg):
    print(arg, id(arg), "関数に渡されたイミュータブルなオブジェクトのidはそのまま")
    arg = "foo"
    print(arg, id(arg), "関数内でイミュータブルなオブジェクトを変更すると関数内ではidが変わる")


var = "abc"
print(var, id(var), "最初のid")
var = "ham"

print(var, id(var), "イミュータブルなオブジェクトを変更するとidが変わる")

func(var)

print(var, id(var), "関数内でイミュータブルなオブジェクトに変更を加えても呼び出し元には影響がない")

print("-" * 100)


def func2(arg2):
    print(arg2, id(arg2), "関数に渡されたミュータブルなオブジェクトのid")
    for i in range(len(arg2)):
        arg2[i] *= 2
    print(arg2, id(arg2), "破壊的変更後のミュータブルなオブジェクトのid")


lst = [1, 2, 3, 4]
print(lst, id(lst), "ミュータブルなオブジェクトの最初のid")
func2(lst)
print(lst, id(lst), "ミュータブルなオブジェクトに破壊的変更を加えてもidは同じ")

VBAの値渡し
Sub test()
    Dim ary As Variant: ary = Array(1, 2, 3, 4)
    aryprint ary
    func ary
    aryprint ary
End Sub

Private Sub aryprint(ByVal ary As Variant)
    Dim i As Long
    For i = LBound(ary) To UBound(ary)
        Debug.Print ary(i)
    Next
    Debug.Print
End Sub

Private Sub func(ByVal ary As Variant)
    Dim i As Long
    For i = LBound(ary) To UBound(ary)
        ary(i) = ary(i) * 2
    Next
End Sub

2022/10/13 08:46