False true ile ilgili soru

iyi günler, kitaptaki şu orneği vs codeda calıstırınca hep true değerini alıyorum.
a = 256
a is 256
True

a = 257
a is 257
False

a = -5
a is -5
True

a = -6
a is -6
False

yani şu şekilde vs codea yazıyorum :
a = -6
a is 6
print(bool(a) gibi ve hep true sonucu cıkıyor.

soru

Konuya hakim değilim ama anladığım kadarını söyleyeyim,
Bu durum, söz konusu değerlerin adresleriyle alakalı.
Python’da id() fonksiyonu ile değişkenlerin adres değerlerini elde edebiliyorsunuz.
is operatörü de iki değerin adreslerinin aynı olup olmadığına bakıyor.
Mesela,

a = 256
id(a)   → 1458610727312
id(256) → 1458610727312

Buna bağlı olarak a is 256 bize True değerini veriyor.

Şimdi ise 257 değerine bakalım.

a = 257
id(a)   → 1458650914192
id(257) → 1458650912656
id(257) → 1458650914160

Yukarıda görüldüğü üzere, 257 değeri için her seferinde farklı bir adres değeri dönüyor. Buna bağlı olarak a is 257 bize False değerini veriyor.

Yalnızca -5 ila 256 arasındaki sayıların adres değerleri sabit oluyor.

Bir siteden şöyle bir alıntı yapayım,
The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object.

Yani -5 ila 256 arasındaki sayılar zaten öncesinde var edilmiş olduklarından, adresleri aynı. Fakat bu aralığın dışındaki sayılar yeniden oluşturulduğu için farklı adresler elde ediyoruz.

https://codeburst.io/the-unseen-pitfalls-of-python-7ca57f021d08

1 Beğeni

konuyu anladım ama sorun şurda;

vs codeda bu uygulamayı yapamadım. false true sonucunu alamadım yani hep true veriyor mesela

ama idle dediğimiz o notepad tarzı şeyde aynen konu anlatıldıgı gibi true yada false veriyor.

bunu beceremedım vs codeda :slight_smile:

a is 6 False yazım hatası yapmış olabilirsin a= -6 a is 6 demişsin -6 yazman gerek.
bool(a) True olur. False, 0 ve “” boşluk harici değerler True döndürür.

bu yorumda orasını yanlıs yazmısım ama hala vs codeda yazbel kitapta anlatıldıgı gibi true false alamadım, yani bu deger normalde a false vermesi lazım ama idle notepadde false veriyor vs codeda true veriyor. ben ilgili vs codeunu mu yazamadım bilmiyorum

a = 500
a is 500
print(bool(a))

print(bool(a)) bu satır size True değerini veriyor.
sizin print(a is 500) şeklinde yazmanız lazım.

abi inanmayacaksın ama
a = 500
print(a is 500)

hala true degeri veriyor :smiley: ben anlamadım bu vs codeu

Hangi kitap?

Yukaridaki ornekler a is 6 ifadesinin degerini gosteriyor, bool(a)'nin degil.

Bu arada Python’da sayilar ile is kullanmanin pek bir manasi yok.

2 Beğeni

şu kitap https://python-istihza.yazbel.com/islecler.html

burada zaten zannediyorum işin mantıgını anlatması acısından kullanılmış sayılar ile is ve =

bu arada zannediyorum cevabını buldum

https://www.reddit.com/r/learnpython/comments/uf9dna/a_question_about_and_is/i6s49oq/?context=3

Bu doğru değil. @bekirozcan’ın attığı linkte de anlatıldığı gibi mevcut implementasyon modüldeki tekrar eden unmutable literalleri tek bir değer halinde saklıyor. Ayrıca referans herhangi bir unmutable tip için interning uygulanmasını engellemiyor.

2 Beğeni

Anladim. Kitap, maalesef zaman zaman gereksiz detaylara girebiliyor. is operatorunun/obje identity’sinin calisma mantigi bunlardan bir tanesi. Interning, allocation havuzlari ve stratejileri gibi seyleri bilmeyen/bilmesi gerekmeyen insanlar icin fazla gereksiz bir detay. Giris seviyesi bir yazida yeri yok.

2 Beğeni

yazdıgım gibi aslında henuz cok cok yeniyim araştırırken nerelere geldik oldu biraz. yazbel kitaptaki bilgiler gerçekten cok guzel yazana yazanlara teşekkür ediyorum