私のpython記録学習プロセス-Day06にid == /ブロック/セットです/色合いをコピーします

Aは、== IDの使用であります

  Pythonでは、idは限り、あなたはデータ(オブジェクト)を作成すると、それはメモリ内のスペースを開きます、このデータは一時的にこのスペースは、IDカード番号のように、一意のIDを持っている、メモリにロードされ、メモリ・アドレスです、識別メモリアドレス空間が呼び出され、データ(オブジェクト)のIDである、あなたは、データのメモリアドレスを取得するために)(IDを使用することができます。

name = 'Dylan'
print(id(name)) # 4319709032

==比較値は、リターンに真または偽の結果である、両側で同じです。

メモリアドレスが等しい場合では、比較的メモリアドレスの両側は、同じメモリアドレスの両側に、次に点等しいです。どの見返りに、TrueまたはFalseの結果です。

name = ['Dylan']
name2 = ['Dylan']
print(name is name2)    # False
print(name == name2)    # True
print(id(name))         # 4387384328
print(id(name2))        # 4387382920

# 这里表示:name name2数值是一样的,但却不是同一个内存地址。

だから、:メモリアドレスが同じであれば、その値は確かに同じですが、値は必ずしも、同じメモリアドレス同じである場合。

第二に、コードブロック

  • Pythonプログラムは、コードブロックによって構成され、ブロックがテキストPythonプログラムであり、彼はユニットとして実行されます。

    ブロック:モジュール、関数、クラス、ファイルなどは、コードのブロックです。

  • 各コマンドは、コードブロックとして対話形式で入力されます。

    相互作用は何ですか?

    Pythonはインタプリタに聞かせCMDに、コードの各行は、コードブロックです。

第三に、コードの同じブロックにおけるキャッシング機構

  • 前提条件:同じブロック内。
  • 機構コンテンツ: Pythonオブジェクトを初期化するコードの同じブロック中に実行されるコマンド、値が既に存在するかどうかを確認し、存在する場合、それが再利用されます。言い換えれば、あなたが同じブロックを実行すると、オブジェクトを初期化するコマンドに遭遇し、彼はこの変数の値で初期化されます辞書に新しい変数ます最初のクエリレコードの顔には、辞書に格納され、あなたが同じレコードを持っている場合、それは、この辞書の前にこの値を再利用します。同じid:実行ファイル(同じブロック)がI1になるときので例は、与えられた、i2の二つの変数は、それらは、すなわち一つだけのメモリ、の存在下でのキャッシュメカニズムを満たすため、同じオブジェクトを指しています。
  • 適し: int型(float型)、BOOL、STR。
  • 特定のルール:
    • INT(フロート):コードの同じブロック内の任意の数の多重化されています。
    • ブール値:TrueとFalse 1,0の方法は、辞書、および再利用に存在しています。
    • STR:ほぼすべての文字列のキャッシュメカニズムを満たします。
  • 利点:メモリ保存、パフォーマンスを向上させます。

異なるコードブロック内のキャッシュ機構(小データ・プール)

  • 前提条件:異なったコードブロック。

  • メカニズムのコンテンツ:パイソン自動的に256にしてから-5整数キャッシュされ、これらの整数を変数に代入し、オブジェクトが、すでに作成されたキャッシュオブジェクトの使用を再作成していないだろうとき。

    Pythonの文字列は、一定のルールになります存在がプール文字列あなた変数に割り当てられたこれらの文字列、および再作成されることはありませんオブジェクトが、プール内の文字列が存在する中で使用が作成されたときに、コピーを作成し、これは、オブジェクト。

      、実際には、両方のキャッシュまたはプールが存在する文字列は、Pythonの最適化で作られた文字列の整数であり、そして「プール」(コンテナ、または辞書)に入れ〜5から256の一定のルール、これらの範囲内の文字列または整数へのポイントは、その後、彼は「プール」で直接引用されたことをプログラム変数かどうか、含意はのメモリを作成することです。

  • 適し: int型(float型)、BOOL、STR。

  • 特定のルール:

    • INT(フロート):整数のために、小さなデータプールの範囲であることを-5 256に、複数の変数が同じ(この範囲内で)番号を指している場合は、すべて知っている私たちは、彼らは、メモリを指していますこれは、メモリ・アドレスです。
    • ブール値:TrueとFalse 1,0の方法は、辞書、および再利用に存在しています。
    • STR:文字列は、ルールを満たします。
  • 利点:メモリ保存、パフォーマンスを向上させます。

  • 要約:
    • 質問のテストをインタビュー。
    • キャッシュ機構のために同じコードブロックの下に:私たちはそれを明確にしなければならない回答。異なるキャッシングの別のアプリケーションコードブロック(小データ・プール)
    • 小さなデータは、プール:-5 256の範囲の数字を。
    • メカニズムをキャッシュすることの利点は:メモリ保存、パフォーマンスを向上させます。

第四に、コレクション(理解)

セットはハッシュ要素(不変タイプ)の内部にある順不同、ユニークなデータセットですが、ハッシュ自体が設定されていません(それはセットの辞書には、結合していないです)。

  • 最も重要な点の集合:
    • デエンファシス、リストはコレクションとなり、自動的に重く行きます。
    • 関係テスト、テストデータ、貧しい人々、労働組合や他の関係の二組の交差点の前に。
  • コレクションと辞書

    • のコレクションを作成します。

      # 方法一
      set1 = set({'name', 'Dyaln', 'age', 111, 434})
      # 方法二
      set1 = {'name', 'Dyaln', 'age', 111, 434}
    • 辞書およびフォーマットのセット:

      # 字典
      dic = {'name':'Dylan', 'age': 18}
      # 集合
      set1 = {'name', 'age', 18, False, True, }
    • 空の辞書:

      dic = {}
      # 或者
      {}
      print({}, type({}))     # {} <class 'dict'>
    • 空のセット:

      set()
      print(set(), type(set()))       # set() <class 'set'>
    • コレクションの有効性:

      set1 = {[1, 3, 5], 3, {'name': 'Dylan'}}
      print(set1)     
      # 报错
        File "/Users/yaoyaoba/Full_stack_22/day06/练习.py", line 24, in <module>
      set() <class 'set'>
          set1 = {[1, 3, 5], 3, {'name': 'Dylan'}}
      TypeError: unhashable type: 'list'
      # 集合内的元素必须是 可合希类型(不可变数据类型)
  • 操作のセット

    • 増加

      • set.add()

        set1 = {'name', 'Dylan', 'xiaowang', 'yaoyao', 'age'}
        set1.add('xx')
        print(set1)     # {'xiaowang', 'xx', 'age', 'yaoyao', 'name', 'Dylan'}
      • set.update()反復増加(自動的に重複除去)

        set1 = {'name', 'Dylan', 'xiaowang', 'yaoyao', 'age'}
        set1.update('abcdedfdaefdafdsa')
        print(set1)     # {'yaoyao', 'age', 'd', 'e', 'a', 'Dylan', 'xiaowang', 'b', 'f', 'c', 'name', 's'}
    • [削除]

      • set.remove()要素を押すと削除します

        set1 = {'name', 'Dylan', 'xiaowang', 'yaoyao', 'age'}
        set1.remove('age')
        print(set1)     # {'xiaowang', 'yaoyao', 'Dylan', 'name'}
      • set.pop()をランダムに削除

        set1 = {'name', 'Dylan', 'xiaowang', 'yaoyao', 'age'}
        set1.pop()
        print(set1)      # {'yaoyao', 'age', 'xiaowang', 'Dylan'}
      • set.clear()空のセット

        set1 = {'name', 'Dylan', 'xiaowang', 'yaoyao', 'age'}
        set1.clear()
        print(set1)     # set()
      • デル設定の削除コレクション

        set1 = {'name', 'Dylan', 'xiaowang', 'yaoyao', 'age'}
        del set1
        print(set1)     # 会报错,因为己经没有这个集合了
        # 报错信息如下:
        Traceback (most recent call last):
          File "/Users/yaoyaoba/Full_stack_22/day06/练习.py", line 28, in <module>
            print(set1)     # 会报错,因为己经没有这个集合了
        NameError: name 'set1' is not defined
    • 操作の他のセット

      • 交差点。(OR交差点)

        set1 = {1, 2, 3, 4, 5}
        set2 = {4, 5, 6, 7, 8}
        print(set1 & set2)  # {4, 5}
      • 連合。(|またはUNION)

        set1 = {1, 2, 3, 4, 5}
        set2 = {4, 5, 6, 7, 8}
        print(set1 | set2)  # {1, 2, 3, 4, 5, 6, 7, 8} 
      • 差分セット。( - 又は差)

        set1 = {1, 2, 3, 4, 5}
        set2 = {4, 5, 6, 7, 8}
        print(set1 - set2)  # {1, 2, 3} 
      • アンチ交差点。(^それともsymmetric_difference)

        set1 = {1, 2, 3, 4, 5}
        set2 = {4, 5, 6, 7, 8}
        print(set1 ^ set2)  # {1, 2, 3, 6, 7, 8}
      • サブセットとスーパーセット

        set1 = {1,2,3}
        set2 = {1,2,3,4,5,6}
        
        print(set1 < set2)
        print(set1.issubset(set2))  # 这两个相同,都是说明set1是set2子集。
        
        print(set2 > set1)
        print(set2.issuperset(set1))  # 这两个相同,都是说明set2是set1超集。
      • リストの重複除外

         l1 = [1,'Dylan', 1, 2, 2, 'Dylan',2, 6, 6, 3, 'Dylan', 4, 5]
        # set1 = set(l1)
        # l1 = list(set1)
        # print(l1)
        
        # 用处:数据之间的关系,列表去重。

第五に、コピー深さ

コピーはまた、コピーとして知られ、実際にコピーです。実際には、コピーの深さは、完全なコピーである、との意味の一部のコピー。

  • 代入演算子を見てください

    l1 = [1, 2, 3, ['Dylan', 'age']]
    l2 = l1
    l1.append(456)
    print(l1)   # [1, 2, 3, ['Dylan', 'age'], 456]
    print(l2)   # [1, 2, 3, ['Dylan', 'age'], 456]
    print(id(l1))   # 4387382920 内存地址是一样的
    print(id(l2))   # 4387382920 内存地址是一样的

    彼らは正確に変数リストの残りの後に同じリストに同じ、L1、L2ポイントは、リスト上の変数の変更、ですので、代入演算子の場合は、同じメモリアドレスへのL1およびL2ポイントですこのリストには、変更後のリストです。

  • 浅いコピーコピー

    l1 = [1, 2, 3, ['Dylan', 'age']]
    l2 = l1.copy()
    print(id(l1))   # 4335892104
    print(id(l2))   # 4335903304
    # 这说明,通过 copy 出来的新列表,在内存中又开辟了一块新的内存空间,两者间不是指向的同一个列表。
    # 但是,如果再做如下操作你会发现什么?
    
    print(id(l1[-1]))   # 4370607112
    print(id(l2[-1]))   # 4370607112
    # 你会发现,咦?内存地址是一样的,说明是同一个数据。

    このことから、我々はそれを見ることができ、実際には、浅いだけコピーリストのシェルをコピーします。

    浅いコピーのために、それだけでメモリ内に再作成された新しいリストのためのスペースを開きますが、元のリストの要素を持つ新しいリスト内の要素が一般的です。

    問題もあります。

    不変データタイプリストを変更する場合、それはそのようなリストのようなデータ・タイプのハッシュであるため、リストの新しい内容は、一緒に変更されるべきではなく、変数のデータ・タイプは、その後、カラムに新しい変更または削除しますリストが一緒に変更されます。

  • ディープコピーdeepcopy

    import copy
    l1 = [1, 2, 3, ['Dylan', 'age']]
    l2 = copy.deepcopy(l1)
    print(id(l1))   # 4343088456
    print(id(l2))   # 4370618248
    # 这说明,通过 copy 出来的新列表,在内存中又开辟了一块新的内存空间,两者间不是指向的同一个列表。
    
    print(id(l1[-1]))   # 4379005512
    print(id(l2[-1]))   # 4379005832
    # 咦?内存地址不一样了,说明不是同一个数据了。
    
    print(id(l1[0]))    # 4305226112
    print(id(l2[0]))    # 4305226112
    # 哎我去!又一样了,咋回事儿?

    ディープコピー機能は、変数のデータ型である変数のデータ型は前に使用されているのではなく、メモリに再作成します。

    しかし、不変のデータタイプとして浅いと同じコピーがあっても、同じメモリアドレスならば、あなたは彼を変更すると、新しいリストと一緒に、彼は不変のデータ・タイプ(ハッシュ可能)であるという理由だけで、変更されません。

  • 関連インタビューの質問

    l1 = [1, 2, 3, [22, 33]]
    l2 = l1[:]
    l1[-1].append(666)
    print(l1)   # [1, 2, 3, [22, 33, 666]]
    print(l2)   # [1, 2, 3, [22, 33, 666]]
    浅copy: list dict: 嵌套的可变的数据类型是同一个。
    深copy: list dict: 嵌套的可变的数据类型不是同一个 。

おすすめ

転載: www.cnblogs.com/guanshou/p/12046854.html