Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Python's = Operator pada Senarai Menghasilkan Gelagat Keadaan Dikongsi yang Tidak Dijangka?

Mengapa Python's = Operator pada Senarai Menghasilkan Gelagat Keadaan Dikongsi yang Tidak Dijangka?

Linda Hamilton
Linda Hamiltonasal
2024-12-14 17:08:18869semak imbas

Why Does Python's  = Operator on Lists Produce Unexpected Shared-State Behavior?

Gelagat Tidak Dijangka = Operator pada Senarai

Operator = dalam Python mempamerkan tingkah laku yang tidak dijangka apabila beroperasi pada senarai, seperti yang ditunjukkan dalam kod berikut coretan:

class foo:
    bar = []
    def __init__(self, x):
        self.bar += [x]


class foo2:
    bar = []
    def __init__(self, x):
        self.bar = self.bar + [x]

f = foo(1)
g = foo(2)
print(f.bar)
print(g.bar)

Output:

[1, 2]
[1, 2]

Pengendali = nampaknya mempengaruhi setiap kejadian kelas, manakala foo = foo bar berkelakuan seperti yang diharapkan.

Tingkah laku ini berpunca daripada pelaksanaan asas operator =. Ia mula-mula cuba memanggil kaedah khas iadd, yang bertujuan untuk penambahan di tempat dan mengubah suai objek yang ia bertindak. Jika iadd tidak tersedia, ia akan kembali kepada kaedah khas tambah, yang mengembalikan objek baharu.

Dalam kes senarai, hanya tambah ditakrifkan, yang mengembalikan senarai baharu. Oleh itu, apabila = digunakan pada senarai, ia mencipta senarai baharu dan bukannya mengubah senarai sedia ada. Ini menerangkan sebab f dan g berkongsi senarai bar yang sama dalam contoh di atas.

Operator = berkelakuan berbeza untuk objek boleh ubah, di mana ia mengubah suainya di tempat melalui kaedah iadd. Untuk objek tidak berubah seperti rentetan dan integer, hanya tambah yang tersedia, menghasilkan penciptaan objek baharu.

Untuk meringkaskan:

  • = menggunakan iadd jika ditakrifkan, mengubah suai objek di tempat.
  • Jika iadd tidak ditakrifkan, = kembali kepada __add__, mencipta objek baharu.
  • Untuk objek boleh ubah, = mengubah suai objek di tempat .
  • Untuk objek tidak berubah, = mencipta objek baharu.

Atas ialah kandungan terperinci Mengapa Python's = Operator pada Senarai Menghasilkan Gelagat Keadaan Dikongsi yang Tidak Dijangka?. 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