Pythonのインスタンス渡し

今日、職場でふと疑問に思ったこと。インスタンス変数に代入されている別のインスタンスインスタンス変数を、そのインスタンスの外で変更した場合、すでにインスタンス変数に代入されているインスタンスインスタンス変数も更新されているのだろうか。

わかりにくくて申し訳ないんですけど、私にはこれ以上、平明に説明できる自信はありません。

もしPythonが、引数としてインスタンスを渡す際にそれをコピーしているのだとしたら、変数は更新されないでしょう。

ですが、Pythonが、Perlでいうリファレンス、Cでいうポインタ? のように、インスタンスの参照を渡しているのだとしたら、連動して更新されるはず。そして、私は、こういう挙動をするだろうと予想、というか期待して、けれど本当のところはどうなんだろう。

試してみることにしました。

Python 3.0.1 (r301:69597, Feb 14 2009, 19:03:52) 
[GCC 4.0.1 (Apple Inc. build 5490)] on darwin
Type "copyright", "credits" or "license()" for more information.
>>> class TestPrint:
	def __init__(self, val):
		self.val = val
	def do_print(self):
		print(self.val.get_s())

		
>>> class Val:
	def set_s(self, s):
		self.s = s
	def get_s(self):
		return self.s

	
>>> val = Val()
>>> val.set_s('spam')
>>> tp = TestPrint(val)
>>> tp.do_print()
spam
>>> val.set_s('ham')
>>> tp.do_print()
ham
>>> quit()

予想どおりの挙動をしめしてくれました。よかった。この方がずっとやりやすいと思います。

けど、多分こういうことは、Pythonを使っている人にとっては常識なんでしょうね。