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
Lepaskan: 2024-12-14 17:08:18
asal
873 orang telah melayarinya

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)
Salin selepas log masuk

Output:

[1, 2]
[1, 2]
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan