Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapakah `list.__iadd__` mengubah suai senarai asal dan senarai yang ditetapkan, manakala `list.__add__` hanya mengubah suai senarai yang ditetapkan?

Mengapakah `list.__iadd__` mengubah suai senarai asal dan senarai yang ditetapkan, manakala `list.__add__` hanya mengubah suai senarai yang ditetapkan?

Susan Sarandon
Susan Sarandonasal
2024-10-30 17:05:25604semak imbas

Why does `list.__iadd__` modify both original and assigned lists, while `list.__add__` only modifies the assigned list?

Percanggahan Gelagat antara senarai.__iadd__ dan senarai.__add__

Pertimbangkan coretan berikut:

<code class="python">x = y = [1, 2, 3, 4]
x += [4]
print(x)  # Outputs: [1, 2, 3, 4, 4]
print(y)  # Outputs: [1, 2, 3, 4, 4]</code>

Sebaliknya , perhatikan ini:

<code class="python">x = y = [1, 2, 3, 4]
x = x + [4]
print(x)  # Outputs: [1, 2, 3, 4, 4]
print(y)  # Outputs: [1, 2, 3, 4]</code>

Mengapakah kedua-dua coretan kod ini berkelakuan berbeza?

Penjelasan

Perbezaan utama terletak pada penggunaan " " pengendali. Dalam coretan pertama:

  • x = [4] menggunakan kaedah __iadd__ kelas senarai, yang:

    • Memutasi senarai asal (x) dalam -place
    • Melanjutkannya dengan elemen daripada senarai kedua ([4])

Ini menyebabkan kedua-dua x dan y diubah suai untuk memasukkan nilai 4.

Walau bagaimanapun, dalam coretan kedua, x = x [4] menggunakan kaedah __add__:

  • x [4] mencipta senarai baharu dengan menggabungkan x dengan [4]
  • Pembolehubah x kemudiannya ditugaskan semula ke senarai baharu ini
  • y kekal tidak berubah kerana ia adalah objek yang berbeza

Oleh itu, x mempunyai nilai [1, 2 , 3, 4, 4] manakala y masih memegang nilai asal [1, 2, 3, 4].

Atas ialah kandungan terperinci Mengapakah `list.__iadd__` mengubah suai senarai asal dan senarai yang ditetapkan, manakala `list.__add__` hanya mengubah suai senarai yang ditetapkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn