Bandingkan jika dua variabel mereferensikan objek yang sama dengan python

Jawaban:

133

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

Jochen Ritzel
sumber
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
12

y is xakan True, y is zakan menjadi False.

Mark Rushakoff
sumber
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
ted
sumber
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)
Tagihan
sumber
Catatan @ted tentang penggunaan id cukup relevan di sini.
Leo Ufimtsev
2

Saya sangat suka mendapatkan umpan balik visual, itulah mengapa saya terkadang hanya membuka http://www.pythontutor.com/visualize.html#mode=edit untuk melihat bagaimana memori dialokasikan dan apa yang mereferensikan apa.

masukkan deskripsi gambar di sini

Menambahkan gif yang luar biasa ini karena balasan ini adalah tentang visualisasi ..

pengguna1767754
sumber
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.

Scott Woods
sumber
1
Hasil tangkapan dokumen yang bagus.
prosti