Bagaimana cara memeriksa apakah dua variabel mereferensikan objek yang sama?
x = ['a', 'b', 'c']
y = x # x and y reference the same object
z = ['a', 'b', 'c'] # x and z reference different objects
Bagaimana cara memeriksa apakah dua variabel mereferensikan objek yang sama?
x = ['a', 'b', 'c']
y = x # x and y reference the same object
z = ['a', 'b', 'c'] # x and z reference different objects
Jawaban:
Itulah isuntuk: x is ymengembalikan Truejika xdan yadalah objek yang sama.
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?
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
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.
"af" is "af"atau () is ()... mengapa mereka berbagi lokasi memori yang sama?
y is xakan True, y is zakan menjadi False.
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
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)
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.
Menambahkan gif yang luar biasa ini karena balasan ini adalah tentang visualisasi ..
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.