Pertanyaan Bagaimana daftar Python. Hapus (nilai) menentukan nilai apa yang harus dihapus?


Jika saya memiliki daftar objek:

l = [a, b, c]

Lalu saya menghapus salah satu objek tersebut:

l.remove(a)

Bagaimana python menentukan item mana dalam daftar untuk dihapus (di bawah kap)?

Apakah ini menggunakan lokasi memori a? (yang dapat Anda lihat dengan hex(id(a)))


6
2017-12-20 01:57


asal


Jawaban:


  1. Ini iterates melalui daftar, membandingkan setiap item dengan item yang akan dihapus dan jika menemukan kecocokan, itu hanya menghapus itu. Ia bekerja di O (N). Sumber: https://wiki.python.org/moin/TimeComplexity

  2. Ini hanya menghapus item yang cocok pertama dan segera kembali.

  3. Jika item yang akan dihapus tidak ada, itu gagal ValueError

Ini adalah listremove fungsi yang menghapus item dari daftar dan menggunakan PyObject_RichCompareBool untuk memeriksa apakah barangnya sama. Dan PyObject_RichCompareBool diimplementasikan seperti ini

/* Quick result when objects are the same.
   Guarantees that identity implies equality. */
if (v == w) {
    if (op == Py_EQ)
        return 1;
    else if (op == Py_NE)
        return 0;
}

res = PyObject_RichCompare(v, w, op);

Jika identitas benda-benda itu sama (jika kedua benda itu sama), maka kembalikan 1 jika tidak bandingkan nilai dan kembalikan hasilnya.


6
2017-12-20 02:00



Python menggunakan tes kesetaraan ==. Itu remove metode serupa dengan fungsi berikut:

def list_remove(a, el):
    for i in range(len(a)):
        if a[i] == el:
            del a[i]
            return
    raise ValueError("item not found")

3
2017-12-20 02:02



  1. jika kelas objek anggota dalam daftar mendefinisikan __eq__() metode atau __cmp__() metode, itu akan memanggil metode ini untuk membandingkan.

  2. jika tidak menyesuaikan metode perbandingan, maka instance non-identik dari kelas biasanya dibandingkan sebagai tidak sama. itu berarti alamat objek digunakan untuk membandingkan.


0
2017-12-20 02:29