Bandingkan jika dua variabel mereferensikan objek yang sama dengan python


Jawaban:


133

Itulah isuntuk: x is ymengembalikan Truejika xdan yadalah objek yang sama.


6
Dalam contoh, x is zreturn False. Tetapi jika x dan z diberi nilai yang sama, bukan daftar (misalnya x, z = 13, 13), maka akan x is zdikembalikan True. Mengapa demikian?
Tagihan

12
@Bill: Itu adalah artefak tentang bagaimana python menangani int. Python mengalokasikan objek integer ke mana xdan ztitik. Karena bilangan bulat kecil adalah kegagalan umum (-1 sebagai nilai kesalahan, 0 setiap kali Anda benar-benar mengindeks sesuatu, angka kecil biasanya merupakan nilai default yang wajar) Python mengoptimalkan dengan melakukan pra-alokasi bilangan kecil (-5 hingga 256) dan menggunakan kembali objek bilangan bulat yang sama. Jadi contoh Anda hanya berfungsi untuk angka dalam kisaran ini. Coba tetapkan sesuatu yang lebih besar, yaitu 270. Untuk info lebih lanjut lihat di sini
ted

1
@AndresR Tidak, itu salah. ismemeriksa apakah dua nama merujuk pada lokasi memori yang sama. Ini tidak ada hubungannya dengan objek itu sendiri. Sangat mudah untuk memiliki objek yang tidak dapat diubah seperti string yang sama tetapi tidak disimpan di lokasi yang sama, misalnya ''a'*10000 is 'a' * 10000False.
Jochen Ritzel

1
@JochenRitzel Anda benar sekali, terima kasih atas komentar ini! Jadi, saya tidak mengerti apa yang terjadi dengan "af" is "af"atau () is ()... mengapa mereka berbagi lokasi memori yang sama?
AndresR

2
@AndreasR Untuk string / angka literal dalam kode kompilator memeriksa bahwa mereka hanya ada sekali dan menggunakannya kembali. Nilai-nilai khusus seperti (), None, True, False dll juga didefinisikan sebagai lajang. Selama eksekusi, runtime juga mencoba menggunakan kembali angka dan string kecil, tetapi pada akhirnya itu adalah pertukaran antara kecepatan dan memori dan apa yang terjadi tergantung pada bagaimana runtime Python diimplementasikan.
Jochen Ritzel


11

Sementara dua solusi yang benar x is zdan id(x) == id(z)telah diposting, saya ingin menunjukkan detail implementasi python. Python menyimpan bilangan bulat sebagai objek, sebagai pengoptimalan, ia menghasilkan sekumpulan bilangan bulat kecil pada awalnya (-5 hingga 256) dan menunjukkan SETIAP variabel yang memegang bilangan bulat dengan nilai kecil ke objek yang sudah diinisialisasi ini. Info lebih lanjut

Ini berarti bahwa untuk objek integer yang diinisialisasi ke angka kecil yang sama (-5 hingga 256) memeriksa apakah dua objek sama akan mengembalikan true ( ON C-Pyhon , sejauh yang saya tahu ini adalah detail implementasi ), sedangkan untuk yang lebih besar angka ini hanya mengembalikan true jika satu objek diinisialisasi dari yang lain.

> i = 13
> j = 13
> i is j
True

> a = 280
> b = 280
> a is b
False

> a = b
> a
280
> a is b
True

python3.6: a = 98765; b = 98765; a adalah b => Benar. Sesuatu tampaknya telah berubah.
Mikhail Kalashnikov

@Tokopedia Tidak. Saya menguji Python 3.6.2, ini masih ada.
nix

masih ada di python 3.7.7
Bill Huang

9

Anda juga dapat menggunakan id () untuk memeriksa objek unik mana yang dirujuk oleh setiap nama variabel.

In [1]: x1, x2 = 'foo', 'foo'

In [2]: x1 == x2
Out[2]: True

In [3]: id(x1), id(x2)
Out[3]: (4509849040, 4509849040)

In [4]: x2 = 'foobar'[0:3]

In [5]: x2
Out[5]: 'foo'

In [6]: x1 == x2
Out[6]: True

In [7]: x1 is x2
Out[7]: False

In [8]: id(x1), id(x2)
Out[8]: (4509849040, 4526514944)

Catatan @ted tentang penggunaan id cukup relevan di sini.
Leo Ufimtsev


2

Ini dari docs.python.org: "Setiap objek memiliki identitas, tipe, dan nilai. Identitas objek tidak pernah berubah setelah dibuat; Anda mungkin menganggapnya sebagai alamat objek dalam memori. Operator 'is' membandingkan identitas dua objek; fungsi id () mengembalikan integer yang mewakili identitasnya. "

Rupanya setiap kali Anda mengubah nilai, objek dibuat ulang seperti yang ditunjukkan oleh perubahan identitas. Garis x = 3 diikuti oleh garis x = 3.14 tidak memberikan kesalahan & memberikan identitas, jenis dan nilai yang berbeda untuk x.


1
Hasil tangkapan dokumen yang bagus.
prosti
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.