以前、Java ストレージ領域のヒープとスタックの関係について紹介しましたが、今日の Python の導入も実は同じ原理です。オブジェクトはデータを保存するためにメモリ内の領域を要求しますが、オブジェクトにアクセスするときは、メモリ内のオブジェクトのデータに直接アクセスするのではなく、参照によってアクセスします。
以下では、例として Python のリスト (リスト) を使用します。これは、リストが異なる型のコレクションを持つことができることを除けば、Java の配列表現と非常によく似ています。
lst1 = [1,2,3]
lst2 = lst1
print('原始的lst1:',lst1)
print('原始的lst2:',lst2,'\n')
lst2[0] = 666
print('更改后的lst1:',lst1)
print('更改后的lst2:',lst2)
ここでは、典型的なリストから要素を削除する別の例を示します。 lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] があると仮定すると、その中の 10 個の要素をすべて削除する必要があります。最後に空のリストを保持します。おそらく誰もが最初はループ方式で実現しようと考えると思います。まず結果をテストしてください。
最終結果は[2,4,6,8,10]となっていることがわかりますが、これはなぜでしょうか?
i = 1 の場合、lst.remove(i)、1 を削除 (i は lst[0] と同等、del lst[0] を実行) lst = [2,3,4,5,6,7,8,9 ,10]
i = 2 の場合、 lst.remove(i) は、remove 2 として理解できません (i は実際には lst[1] と同等であり、del lst[1] を実行します)、 lst = [2,4,5,6,7 , 8、9、10]
i = 3 の場合、 lst.remove(i) は、remove 3 として理解できません (i は実際には lst[2]、execute del lst[2] と同等です)、 lst = [2,4,6,7,8 , 9,10] など、最終結果は [2,4,6,8,10] になります。
したがって、リスト内のすべての要素を完全に一致させて完全に消去したい場合は、スライスまたはコピーを使用してそれを実現できます。
スライス法
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in lst[:]:
lst.remove(i)
print(lst)
コピーリスト方式
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in lst.copy():
lst.remove(i)
print(lst)
PS: 上の例のように、リスト内の奇数を直接削除することも、リスト内の偶数を直接削除することもできます。
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in lst:
lst.remove(i+1)
print(lst)
もちろん、剰余条件判定を加えることでも実現可能である。
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in lst:
if i % 2 != 0:
lst.remove(i)
print(lst)
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in lst:
if i % 2 == 0:
lst.remove(i)
print(lst)
上記では、ソフトウェア テストでテスト ケースを作成するときによく遭遇する、Python のヒープとスタック、およびリストの変更の典型的な例を簡単に紹介しました。対応する論理原則を理解していれば、テスト ケースに柔軟に適用できます。