6.1 変数は参照
Pythonの変数はオブジェクトへの参照であり、変数そのものではないんだ。これってことは、Pythonで変数を作成すると、メモリ内のオブジェクトへの参照を作成しているってこと。
この言語の特徴は、特に関数にオブジェクトを渡したり、他の変数に代入するときに重要な影響があるよね。
変数を作成して値を代入すると、Pythonはその値のためにメモリ内にオブジェクトを確保し、そのオブジェクトへの参照を変数にする。ある変数を別の変数に代入すると、新しい変数は元の変数と同じオブジェクトを指す。これは、オブジェクトが変更可能であれば、ある変数を通じて行った変更は他の変数にも反映されるってこと。
例:
a = [1, 2, 3]
b = a
b.append(4)
print(a) # 出力: [1, 2, 3, 4]
変数b
に数4
を追加したけど、実は変数a
のリストにも追加されてるんだよね。だって、実際にはどちらの変数もリスト[1, 2, 3]のオブジェクトへの参照に過ぎないから。
6.2 不変オブジェクト
Pythonでは、オブジェクトは変更可能なものと 不変なものに分かれるよ。リストや辞書みたいな変更可能なオブジェクトは、作成後に変更できる。
文字列や数値のような不変オブジェクトは、 作成後に変更できない。不変オブジェクトを扱うときは、変更は新しいオブジェクトの作成を引き起こすんだ。
代入はオブジェクトを変えないんだよ:
a = 5 # aはオブジェクト5への参照を保持
b = a # bもオブジェクト5への参照を保持
b = 3 # 今度はbがオブジェクト3への参照を保持
print(a) # 出力: 5
オブジェクトを変更するには、その関数を呼び出すんだよ:
a = [1, 2, 3]
b = a
b.append(4)
print(a) # 出力: [1, 2, 3, 4]
でも不変オブジェクトも関数を持ってて、これらの関数は元のオブジェクトを変えずに、新しい結果を持つ新しいオブジェクトを返すんだ。
name = "Alex"
print(name) # 出力: Alex
name2 = name.lower()
print(name2) # 出力: alex
文字列は不変オブジェクトだから、メソッドがあっても、これらのメソッドは元の文字列オブジェクトを変えないんだよ。代わりに、常に新しい文字列(新しいオブジェクト)を返すだけ。古いオブジェクトはそのまま変わらないんだ。
6.3 Noneタイプの扱い
Pythonには特別なデータ型があって、これは値の欠如を表すんだ。それがNone
。空の変数を示すためや、何も返さない関数の戻り値として使われる。Noneの理解は、特に条件文でのプログラムの挙動やデータ操作において重要だよ。
Noneの基本の使い方
None
はNoneType
クラスの唯一のインスタンス。変数に値がないことを示すために使われる。None
は条件式では偽(False
)と評価されるんだ。
a = None
if a:
print("a is True")
else:
print("a is None or False")
Noneとの比較
変数がNoneかどうかをチェックするには、is演算子
を使うべきで、==でやらないようにしよう。is
演算子は値の等価性ではなく、同一性をチェックするんだ。
a = None
if a is None:
print("a is None")
else:
print("a has value")
関数とNone
None
は、明示的に値を返さない関数でしばしば使われる。関数が値を返さない場合、暗黙的にNone
を返すんだ。
def func():
print("This function returns None")
result = func()
print(result) # 出力: None
Noneとリスト
None
はリスト、タプル、他のコレクションで、特定の位置に要素がないことを示すために使われる。
my_list = [1, None, 3]
print(my_list) # 出力: [1, None, 3]
GO TO FULL VERSION