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:
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!