Python の変数データ型と不変データ型は、基本的かつ重要なテスト ポイントです。簡単に言うと、ここでの変数は可変および不変であり、変数が変更されたときにデータのアドレスが変更されるかどうかを指します。
変数データ型: 変数の値が変更されると、新しいオブジェクトを作成することと同じになります (つまり、アドレスが変更されます)。
変数データ型: 変数の値は変化しますが、オブジェクトのアドレスは変化しません。
不変のデータ型: タプル、文字列、値。
変数データ型: 辞書、リスト、セット。
可変データ型と不変データ型について説明する前に、参照の概念について説明する必要があります。 Python 変数には、ヒープ メモリ内のオブジェクトを指すオブジェクトへの参照が格納されます。ヒープ内に割り当てられたオブジェクトは、変更可能なオブジェクトと不変オブジェクトの 2 つのカテゴリに分類されます。例: s1="abc"。
実際、変数 s1 はオブジェクト abc への参照です。s1 は、abc が格納されているメモリ アドレスを指します。s1 のアドレス値を確認したい場合は、関数 id を使用できます。アドレス値を 10 進数に変換します。以下の図に示すように、print(id(s1)) を使用するだけです。
文字列を例として見てみましょう。コードに直接書き込む:
s1="abc" print(id(s1)) s1="xyz" print(id(s1))
出力:
140712532603136 140712532603168
出力から、文字列型変数の値を変更するとアドレスも変更されることがわかります。
次に、この例を見てみましょう。これは、書面面接でもよく聞かれる質問です。
#上記のコードに基づいて、次のコードを作成します:
s2=s1 print(id(s1)) print(id(s2))
出力:
743316570224 743316570224
s2=s1 が実際には同じ s2 アドレスと s1 アドレスを指していることがわかります。 。
続けて、s2 の値を変更しましょう。
s2="def" print(id(s1)) print(s1) print(id(s2)) print(s2)
出力:
879864758384 xyz 879889887984 def
これを見ると、s2 の値を変更しても s1 の値に影響を与えない理由がわかります。 s1 と s2 は異なるアドレスを指しているため、s1 の値は変更されていません。
例としてリストを取り上げます:
l = [1, 2, 3] print(id(l)) l.remove(1) # 删除元素 print(id(l)) l.append(4) # 增加元素 print(id(l)) l[1] = '8' # 修改元素 print(id(l))
出力:
405927907912 405927907912 405927907912 405927907912
操作の追加、削除、および変更を確認できます。リスト上の値とリストのアドレス 変更はありません。変数の値が変更されるだけで、新しいオブジェクトは作成されません。また、変数によって参照されるオブジェクトのアドレスも変更されません。
次の例を見てください。これは、前の文字列割り当ての例に似ています。
l1=['a','b','c'] l2=l1 print(id(l1)) print(id(l2)) l2.append('d') print("************") print(id(l1)) print(l1) print(id(l2)) print(l2)
出力:
838366483528 838366483528 ************ 838366483528 ['a', 'b', 'c', 'd'] 838366483528 ['a', 'b', 'c', 'd']
l1 と l2 のアドレスは同じであり、相互に影響を与えるため、出力結果についてはここでは説明しません。
リストを文字列のようにコピーして、値は同じでアドレスが異なる 2 つのリストを生成したい場合、どうすればよいのかと尋ねる学生もいるかもしれません。実はこの問題の本質は、リストの直接代入(use = 直接代入)とコピー(コピーは浅いコピーと深いコピーに分かれる)の違いにあります。細部まで深くコピーされておりますので、今後もご注目ください。
ここでは、まず list() コンストラクターを使用してコピーする比較的簡単な方法を紹介します。コードは次のとおりです。
l3=['x','y','z'] l4=list(l3) print(id(l3)) print(id(l4)) l4.append('a') print(l3) print(l4)
出力:
831456302152 831480344136 ['x', 'y', 'z'] ['x', 'y', 'z', 'a']
ご覧のとおり結果から、l3とl4のアドレスは異なるため、相互に影響を与えることはありません。インデックス、リスト生成、copy() などを使用して、2 つのリストが異なるリスト オブジェクトを指すようにすることもできます。ここでは 1 つずつ紹介しません。
以上がPython インタビューでよくある質問: 可変データ型と不変データ型の違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。