Python インタビューでよくある質問: 可変データ型と不変データ型の違い

WBOY
リリース: 2023-05-19 16:04:06
転載
1199 人が閲覧しました

Python 面试高频问题:可变数据类型和不可变数据类型的区别

Python の変数データ型と不変データ型は、基本的かつ重要なテスト ポイントです。簡単に言うと、ここでの変数は可変および不変であり、変数が変更されたときにデータのアドレスが変更されるかどうかを指します。

変数データ型: 変数の値が変更されると、新しいオブジェクトを作成することと同じになります (つまり、アドレスが変更されます)。

変数データ型: 変数の値は変化しますが、オブジェクトのアドレスは変化しません。

不変のデータ型: タプル、文字列、値。

変数データ型: 辞書、リスト、セット。

引用

可変データ型と不変データ型について説明する前に、参照の概念について説明する必要があります。 Python 変数には、ヒープ メモリ内のオブジェクトを指すオブジェクトへの参照が格納されます。ヒープ内に割り当てられたオブジェクトは、変更可能なオブジェクトと不変オブジェクトの 2 つのカテゴリに分類されます。例: s1="abc"。

実際、変数 s1 はオブジェクト abc への参照です。s1 は、abc が格納されているメモリ アドレスを指します。s1 のアドレス値を確認したい場合は、関数 id を使用できます。アドレス値を 10 進数に変換します。以下の図に示すように、print(id(s1)) を使用するだけです。

Python 面试高频问题:可变数据类型和不可变数据类型的区别

不変のデータ型

文字列を例として見てみましょう。コードに直接書き込む:

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 サイトの他の関連記事を参照してください。

ソース:51cto.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート