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
伊久間博之さんの投稿
(投稿ID: 5404)
以下のようなコードを書いて確認してみました。
VBAの値渡し
伊久間博之さんのコメント
(コメントID: 7906)
ミュータブルなオブジェクトをvbaでいう値渡しをする方法はないという理解でいいでしょうか?
小川 慶一さんのコメント
(コメントID: 7907)
以下、「くろのて」さんの記事から。
Pythonの引数には 値渡し という概念はなく、すべて参照が渡ります。
参照(リファレンス)が渡るというと書換可能なイメージがあるかもしれませんが、 Pythonでの書換可否は(基本的に)オブジェクトのミュータブル(可変)・イミュータブル(不可変)によって決まります。
代表的なイミュータブルなオブジェクトを以下に列挙しました。
・int
・str
・bool
・None
・tuple
・frozenset
これらはオブジェクト自身を変更することができないため、 関数で値渡しが行われているように感じるかもしれませんが、単なるオブジェクトの性質によるものです
https://note.crohaco.net/2014/python-argument-intro/#%E5%8F%82%E7%85%A7
伊久間博之さんのコメント
(コメントID: 7908)
やはり参照渡ししかないのですね。
すっきりしました!
伊久間博之さんのコメント
(コメントID: 7909)
これも理解いたしました。
田中 宏明さんのコメント
(コメントID: 7910)
いい質問ですね。
Pythonが参照渡しだけであることをご自身で答えを出されたこともすごいです。
私はミュータブル(可変)が参照渡し、イミュータブル(不可変)が値渡しという、
短絡的な理解をしていました。
勉強になりました。
伊久間博之さんのコメント
(コメントID: 7911)
ただ、その結論に自信がなかったのですっきりしました!