İs ve == arasındaki fark

Merhaba. Python’da Is ve == arasındaki fark nedir?

izlediğim bir videoda, is operatörü sayesinde iki nesninin id’si sorgulanabiliyor demişlerdi. Ancak bu is operatörünü nerelerde, ne için kullanacaığımı anlayamadım.

Bir örnek vererek açıklarsanız sevinirim. Teşekkürler.

== ile değişkenlerin içeriğini kontrol edersiniz. is ile değişkenin birebir aynı olup olmadığını kontrol edersiniz. == için bir özellik daha var: Bu operatörün işlevini class yazarken değiştirebiliyorsunuz. Yanılmıyorsam __equals__ fonksiyonu ile yapılıyordu.

1 Beğeni

Pekala. Diyelim ki şöyle bir kod yazdık:

sor = input("Bir sayı giriniz: ")

if sor == 2:
    print(sor)

Ve şu şekilde:

sor = input("Bir sayı giriniz: ")

if sor is 2:
    print(sor)

Şimdi bu ikisi arasındaki fark nedir? İkisi de aynı anlama gelmiyor mu? Teşekkürler.

Böyle bir durumda aynı anlama geliyor. Ancak şöyle bir durum var:

Liste1=[0,7,12,3]
Liste2=Liste1
# Şimdi Liste2 üzerinde değişiklik yapacağım
Liste2[0]=27
print(Liste1)
# Gördüğünüz gibi değişiklik her iki listeye de uygulandı.

Bu durumda listeler is ile kontrol edildiğinde aynıdır. Bu sorunu çözmek için copy kütüphanesini kullanırız.

import copy
Liste1=[2,5,65,7]
Liste2=copy.copy(Liste1)
#Artık bu ikisi aynı idye sahip değil.
#Yani == kullanırsam doğrudur, is kullanırsam yanlış
if Liste1==Liste2:
    print("==")
if Liste1 is Liste2:
    print("is")

Biraz kafanız karışmış olabilir. Ancak bu duruma düşmeniz oldukça düşük bir olasılık. O yüzden çok irdelenecek bir şey olduğunu düşünmüyorum.

Çoğunluk olarak sorduğum herkes aynı şeyi söyledi :slight_smile: Neyse. İleride aynı nesneler arasında karşılaştırma yaparsam eğer “is”, aynı değerler arasında karşılaştırma yaparsam da “==” operatörünü kullanacağım. Sanırım şimdilik böyle düşünmem yeterli oalcaktır :slight_smile:

Teşekkür ediyorum ilgi ve alakanız için.

1 Beğeni

is işleci verilen iki nesnenin identity’sini (kimliğini) karşılaştırır. Çok özel durumlar dışında ihtiyaç duyacağınızı sanmıyorum.

== ise verilen iki nesnenin sahip oldukları değerleri eşitlik bakımından karşılaştırır.

İlki sor değişkeninin değerinin 2 olup olmadığını kontrol ediyor. Bu kodda sor hiçbir zaman 2 olamaz çünkü input fonksiyonu bir str döndürür.

Eğer input("Bir sayı giriniz: ") yerine int(input("Bir sayı giriniz: ")) yazmak istediğinizi varsayarsak ikinci kod belirli bir Python yorumlayıcısının her an değiştirilebilecek bir implementasyon detayını kontrol ediyor. Oradaki 2 sayısını 500 yaparsanız verdiğiniz iki kodun aynı işi yapmadığını da görebilirsiniz (input(...)'ları da int(input(...)) yapın).


Konu burada da anlatılmış.

__eq__

2 Beğeni

Python’un resmi dokumentasyonunu okudun mu? Suradan baslayabilirsin; sordugun seyleri bir bir yazmislar.

Ne icin kullanilacagi konusunda ise en ufak bir fikrim yok. 20 kusur yildir hic yuksek seviyeli bir dilde, okunur kod yazarken ihtiyacim olmadi (veya beyin zortlamasi geciriyorum). ID almayi ise birkac kere kullandim: Debug esnasinda nereden geldiginden emin olmadigin bir deger varsa ID’leri gostermek ise yarayabiliyor.

4 Beğeni

İs ile, değişkene atadığınız değerlerin adreslerinin ram üzerinde aynı olup olmadığını(yani aynı nesneler olup olmadığını)
== ile ise deģiskene atadığınız değerlerin matematiksel büyüklüğünün, yani değerlerinin aynı olup olmadığını kontrol edersiniz.

Galiba.

2 Beğeni

Biliyorum, “objenin kimlik numarasi” diyip detay vermemek cok tatmin edici degil (ve cok bir sey de ogretmiyor) fakat boyle basit bir yorumlamayla bile dusulebilecek tuzaklara bakarsak:

  • Ayni objenin iki farkli adresi olabilir (memory aliasing, wiki: hardware aliasing)
  • Ayni adreste iki farkli obje olabilir (memory banking)
  • Adres RAM adresi olmak zorunda degil

Bazen sistemleri ve mimarileri bilen insanlarin oraya neden “RAM adresi” yazmadiklarini arastirmak daha ogretici olabiliyor.

== icin ise buyuklugu hic katmazdim (esit olabilen her sey sirali degil, ornegin renkler).

Bu arada ==, __eq__ ve is ile iliskileri ile ilgili bir seyler de var linkledigim sayfada.

4 Beğeni

Hocam kesinlikle haklısın. Ben van noumen mimarisi yani klasik mimariye göre öyle düşündüm. Ama kesinlikle dediğin doğru. Detay öğrenmek onurdur, sereftir. Cehaletimizle yüzleşiriz, ne demek. Teşekkürler bilgi için.

1 Beğeni

Bunlar iki mimari icin de gecerli; koddan bahsetmedigimiz icin durdugu/okundugu yerin onemi yok.

Harvard mimarisine ozel oldugunu dusunme sebebin bu tur muzipliklerin cogunlukla mikroislemcili, gomulu sistemlerde kullanilmasi ve bu sistemlerin cogunlukla Harvard mimarisi olmasi olabilir, ama “klasik” sistemlerde de kullaniliyorlar.

Zaten modern, buyuk sistemlerde programlarin gordugu adresler sanal. Instruction’dan cikip RAM kartina gidene kadar adresi degistiren 3-4 katman var arada.

O kadar dramatik olmaya gerek yok :slight_smile: Sunu yazana kadar gittim Hardvard/von Neumann hangisi hangisiymis baktim (hep karistiriyorum), cagdas sistemlerde aliasing’e ornek olsun diye A20 kapisini tekrar okudum (ve bahsinin gereksiz olduguna karar verdim). Simdi de amd64 mimarisinde MMU’nun nasil calistigini, hangi isleri isletim sistemine biraktigini bilmedigimi fark ettim ve manuelini okuyorum.

Bir taraftan da “cehaletle yuzlesmek” kadar basit ve gunde onlarca defa yapmamiz gereken bir seyin bahsine “dramatik” demek istemiyorum.

5 Beğeni

Saygıyla eğiliyorum.

1 Beğeni

Herkese cevapları için çok teşekkür ediyorum :slight_smile: Detaylıca inceleyeceğim inşallah.

1 Beğeni
if val is not None:
    ...

sık kullanılan bir şey değil mi?

1 Beğeni

Ben de None ile karşılaştırma yaparken is kullanmak idiom diye biliyorum ama bu bir ihtiyaç mıdır? Amacınız val’ı değer olarak None ile karşılaştırmak ise == kullanmalısınız çünkü val, val is None’dan farklı çalışacak bir __eq__ metoduna sahip olabilir.

1 Beğeni

Tam da bu yüzden is kullanılıyor zaten, değil mi?

1 Beğeni

Evet. Çoğunlukla is kullanılma sebebi de None'ın yaygın olarak initialize edilmemiş/henüz işe yarar bir değer atanmamış değişkenleri temsil edecek şekilde kullanılması.

2 Beğeni

=='den farki soruldugu icin onun yerine kullanildigi yerleri es gectim. ..., NotImplemented ve kullanmasi manasiz olsa da False ve True’ya esitligi de boyle test ediyoruz.

1 Beğeni

@Enes is bilgisayarda nereye kaydedildiğine == değere bakar. (Değer mesela bir listenin içindekler)

1 Beğeni