Python'da “(1,) == 1,” nin anlamı nedir?


119

Tuple yapısını test ediyorum ve ==operatörü şu şekilde kullandığımda garip buldum :

>>>  (1,) == 1,
Out: (False,)

Bu iki ifadeyi bir değişkene atadığımda sonuç doğrudur:

>>> a = (1,)
>>> b = 1,
>>> a==b
Out: True

Bu sorular benim görüşüme göre Python tuple sondaki virgül sözdizimi kuralından farklı . ==Operatör arasındaki ifade grubuna soruyorum .


16
Sadece 2 saat önce OP'nin önceki bir sorusuna bakıldığında, bir sorunun nasıl farklı bir şekilde çerçevelenmesinin farklı sonuçlara (ve topluluk içinde kabul görmeye) yol açması harika (veya tuhaf) görünüyor.
AKS

24
@AKS Bunlar farklı sorular
kmaork

7
@AKS Burada sorular marjinal olarak farklı olsa da, fikrinize tamamen katılıyorum. Sürü etkisi aka HNQ.
Deli

5
@PythonNewHand Gerçekten de, tamamen kabul edilebilir. Bu yüzden bir soruyu çerçevelemeye farklı bir şekilde ekledim .
AKS

3
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功 nasıl düşünüyorsun? Bu cevapları gözden geçirdim ve bu özel durumu kapsıyor gibi görünen hiçbir şey görmedim.
Dan Getz

Yanıtlar:


88

Diğer yanıtlar, burada belgelendiği gibi, davranışın operatör önceliğinden kaynaklandığını size zaten göstermiştir .

Bir dahaki sefere buna benzer bir sorunuz olduğunda cevabı nasıl bulacağınızı size göstereceğim. astModülü kullanarak ifadenin nasıl ayrıştırıldığını çözebilirsiniz :

>>> import ast
>>> source_code = '(1,) == 1,'
>>> print(ast.dump(ast.parse(source_code), annotate_fields=False))
Module([Expr(Tuple([Compare(Tuple([Num(1)], Load()), [Eq()], [Num(1)])], Load()))])

Buradan , Tim Peters'ın açıkladığı gibi kodun ayrıştırıldığını görebiliriz :

Module([Expr(
    Tuple([
        Compare(
            Tuple([Num(1)], Load()), 
            [Eq()], 
            [Num(1)]
        )
    ], Load())
)])

1
Başka bir kullanışlı araç dis- Bu durumda, LOAD_CONSTfarklı değerlere ( (1,)ve 1) ve bir BUILD_TUPLEopp koduna sahip iki tane göreceksiniz .
mgilson

153

Bu sadece operatör önceliğidir. Senin ilk

(1,) == 1,

böyle gruplar:

((1,) == 1),

bu nedenle, tek elemanlı demeti eşitlik 1,için tamsayı ile karşılaştırmanın sonucundan tek bir eleman ile bir demet oluşturur. 1Eşit değildirler, bu yüzden False,sonuç için 1-demet elde edersiniz .


61
Tam olarak değil, ama 1-demetlerin garip sözdizimi var. Genel olarak, çok daha fazla, örneğin eğer şaşıracaksınız 1+2, 2==3, 4*7yaptığı değil grup olarak (1+2), (2==3), (4*7). Pratikte, 1-demetler neredeyse hiç kullanılmaz (aslında, StackOverflow sorularının dışında ;-)).
Tim Peters

6
Belki de "beklenmedik", "garip" ten daha iyi bir kelime olurdu. Bakış açınıza ve odaklanmanıza bağlı olarak iki şey olabilecek çizimlerden birine bakıyormuşum gibi hissediyorum . Eşitlik operatörü virgüllere kıyasla o kadar büyük ki, ona odaklanmak ve sonucun True/ olacağını varsaymak kolaydır False. Şimdi ne olduğunu anladığıma göre, tamamen açık ve mantıklı.
skrrgwasme

31
Ve şimdi bunu yapmanın tek bariz yolunun "Hollandalı değilseniz ilk başta açık olmayabileceğini" söyleyerek "Python Zeni" nin ne anlama geldiğini biliyorsunuz ;-)
Tim Peters

7
Dokümanı okuduğunuzda ve bir demeti oluşturan şeyin parantez değil virgül olduğunu gördüğünüzde biraz kafa karıştırıcı! Dolayısıyla bu ifadede sağ eldeki virgül testin bir parçası olarak değil, ayırıcı olarak kabul edilir! Beklenmedik davranış!
Ikra_5

3
İfadelerle ilgili genel tavsiye, "şüphe duyduğunuzda parantez kullanın" şeklindedir. Bunu takiben, tuple sözdiziminin bir parçası olmasalar bile tüm tek dizelerin etrafına parantez koymak iyidir.
nigel222

12

Ne zaman yaparsan

>>> (1,) == 1,

demeti (1,) bir tamsayı ile karşılaştırmanın ve böylece geri dönmenin sonucuyla bir demet oluşturur False.

Bunun yerine değişkenlere atadığınızda, iki eşit tuple birbiriyle karşılaştırılır.

Deneyebilirsin:

>>> x = 1,
>>> x
(1,)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.