Python の可変オブジェクトと不変オブジェクトの詳細な分析

coldplay.xixi
リリース: 2020-07-09 17:59:21
転載
2789 人が閲覧しました

Python の可変オブジェクトと不変オブジェクトの詳細な分析

Python ではすべてのものをオブジェクトとして見ることができます。各オブジェクトには独自の ID、タイプ、値があります。

  1. id: オブジェクトが作成されるとき、その ID は変更されません。ここでの ID は実際にはメモリ内のオブジェクトのアドレスです。メモリ内のオブジェクトを表示するには id() を使用できます。 。
  2. type: id と同様、オブジェクトが作成されると、そのタイプは変更できません。タイプによって、オブジェクトがサポートできる操作が決まります。
  3. value: オブジェクトの値

オブジェクトが変更可能かどうかは、値が変更をサポートしているかどうかによって決まります。

関連する学習の推奨事項: Python ビデオ チュートリアル

不変オブジェクト

一般的な不変オブジェクト (不変)オブジェクト):

  1. 数値: int、float、complex
  2. string
  3. tuple
  4. frozenset: 別のタイプのセット

例を通して感じてみましょう

>>> x=1
>>> y=x
>>> id(x)==id(y)
True
>>> id(1)==id(y)
True
ログイン後にコピー

ここでは 2 つの int オブジェクトが作成され、x、y が同じオブジェクトを指すようにします。 、そして、x 1

>>>x=x+1
ログイン後にコピー

この時点で、x の id 値は、y の id および 1 の id と同じままですか?

>>> x=x+1
>>> id(x)==id(y)
False
>>> id(x)==id(1)
False
>>> id(1)==id(y)
True
ログイン後にコピー

結果から、x が指すオブジェクトが変更されたが、1 は変更されていないことを確認するのは難しくありません。これは不変オブジェクトです。不変オブジェクトの場合、一度作成すると変更することはできません。

注: 不変性は絶対的な不変性と厳密に等価ではありません

>>> a=([1],2,3)
>>> id(a)
4338862696
>>> id(a[0])
4338949128
>>> a[0][0]=0
>>> id(a)
4338862696
>>> id(a[0])
4338949128
ログイン後にコピー

上の例から、a[0] の値を変更したが、その ID には影響しなかったことが簡単にわかります。価値。不変コンテナ オブジェクトに変更可能オブジェクトへの参照が含まれている場合、後者の値が変更されると、前者の値も変更されますが、コンテナの ID 値は変更されないため、コンテナは不変オブジェクトのままです。

# 可変オブジェクト

#共通の可変オブジェクト:

    list
  1. dict
  2. set

例を通じて同様に体験してください

Example

>>> c = [1,2,3]
>>> b = c
>>> id(b)==id(c)
True
ログイン後にコピー

2 つのリスト オブジェクトを作成し、c、d が同じオブジェクトを指すようにします。次に、c

c[0]=4
ログイン後にコピー

を変更しようとします。このとき、2 つのオブジェクトの ID 値が一致しているかどうかを確認します。

>>> id(c)==id(b)
True
ログイン後にコピー

変更後も、c、d は同じオブジェクトを指しています。したがって、変数オブジェクトの場合、値を変更してもその id

関数パラメータ

可変オブジェクトと不変オブジェクトの場合オブジェクトの場合、関数がパラメータとして渡されると動作が異なります。


eg0

def update_list(nums_list):
  print(f'2 id:{id(nums_list)}')
  nums_list += [10]
  print(f'3 id:{id(nums_list)}')

  
number_list = [5, 6]
print(f'1:{number_list}, id:{id(number_list)}')   
update_list(number_list)
print(f'4:{number_list}, id:{id(number_list)}')
ログイン後にコピー

Look結果

#1:[5, 6], id:4457707912
2 id:4457707912

3 id:4457707912
4:[5, 6, 10], id:4457707912

別の例を見てみる

eg1

def add_num(number):
  print(f'2:{id(number)}')
  number += 1
  print(f'3:{id(number)}')


num = 1
print(f'1:{num}, id:{id(num)}')   
add_num(num)
print(f'4:{num}, id:{id(num)}')
ログイン後にコピー
結果を見てみる

1 :1, id:4343768416
2 id:4343768416

3 id:4343768448
4:1, id:4343768416

他の記事では、上記の eg0 は pass by と呼ばれています。 eg1 は値渡しと呼ばれます。ただし、公式ドキュメントにはこれら 2 つの用語に関連する内容が見つからなかったか、この方法は上記 2 つのいずれでもありませんでした。

ここでの重要なポイントは次のとおりです:

可変オブジェクトの場合、関数内の値を変更してもオブジェクトは変更されますが、不変オブジェクトの場合、関数内の値を変更してもオブジェクトは変更されません。影響力

以上がPython の可変オブジェクトと不変オブジェクトの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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