Apa arti dari “(1,) == 1,” dengan Python?


119

Saya menguji struktur tupel, dan saya merasa aneh ketika saya menggunakan ==operator seperti:

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

Ketika saya menetapkan dua ekspresi ini ke variabel, hasilnya benar:

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

Pertanyaan ini berbeda dari Python tuple trailing comma syntax rule dalam pandangan saya. Saya menanyakan kelompok ekspresi di antara ==operator.


16
Melihat pertanyaan sebelumnya oleh OP hanya 2 jam yang lalu, Tampaknya luar biasa (atau aneh) bahwa cara membingkai pertanyaan secara berbeda dapat membawa hasil yang berbeda (dan penerimaan di antara komunitas).
AKS

24
@AKS Ini adalah pertanyaan yang berbeda
kmaork

7
@AKS Meskipun pertanyaannya sedikit berbeda di sini, saya setuju sepenuhnya dengan poin Anda. Efek kawanan alias HNQ.
Gila

5
@PythonNewHand Memang, ini sepenuhnya dapat diterima. Itulah mengapa saya menambahkan pembingkaian pertanyaan itu secara berbeda .
AKS

3
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功 bagaimana menurutmu? Saya membaca sekilas jawaban itu dan tidak melihat apa pun yang tampaknya menutupi situasi khusus ini.
Dan Getz

Jawaban:


88

Jawaban lain telah menunjukkan kepada Anda bahwa perilaku tersebut karena prioritas operator, seperti yang didokumentasikan di sini .

Saya akan menunjukkan kepada Anda bagaimana menemukan jawabannya sendiri saat Anda memiliki pertanyaan yang serupa dengan ini. Anda dapat mendekonstruksi bagaimana ekspresi parsing menggunakan astmodul:

>>> 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()))])

Dari sini kita dapat melihat bahwa kode diurai seperti yang dijelaskan oleh Tim Peters :

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

1
Alat lain yang berguna adalah dis- Dalam hal ini, Anda akan melihat dua LOAD_CONSTdengan nilai berbeda ( (1,)dan 1) dan BUILD_TUPLEkode opp.
mgilson

153

Ini hanya prioritas operator. Anda lebih dulu

(1,) == 1,

kelompok seperti ini:

((1,) == 1),

jadi buat tupel dengan satu elemen dari hasil perbandingan tupel satu elemen 1,dengan bilangan bulat 1untuk persamaan Mereka tidak sama, jadi Anda mendapatkan 1-tupel False,sebagai hasilnya.


61
Tidak juga, tetapi 1-tuple memiliki sintaks yang aneh. Secara umum, Anda akan jauh lebih terkejut jika, misalnya, 1+2, 2==3, 4*7melakukan tidak kelompok sebagai (1+2), (2==3), (4*7). Dalam praktiknya, 1-tuple hampir tidak pernah digunakan (baik, di luar pertanyaan StackOverflow ;-)).
Tim Peters

6
Mungkin "tak terduga" akan menjadi kata yang lebih baik untuk digunakan daripada "aneh". Saya merasa seperti sedang melihat salah satu gambar yang bisa menjadi dua hal, tergantung pada perspektif dan fokus Anda . Operator kesetaraan sangat besar dibandingkan dengan koma, mudah untuk fokus padanya dan berasumsi bahwa hasilnya adalah True/ False. Sekarang saya mengerti apa yang terjadi, itu sangat jelas dan masuk akal.
skrrgwasme

31
Dan sekarang Anda tahu apa artinya "Zen of Python" dengan mengatakan bahwa satu cara yang jelas untuk melakukannya "mungkin tidak jelas pada awalnya kecuali Anda orang Belanda" ;-)
Tim Peters

7
Agak membingungkan ketika Anda membaca dokumen dan melihat bahwa yang membuat tupel adalah koma, bukan tanda kurung! Jadi dalam pernyataan ini koma di tangan kanan tidak dianggap sebagai bagian dari tes tetapi dianggap sebagai pemisah! Perilaku tak terduga!
Ikra_5

3
Saran umum tentang ekspresi adalah "jika ragu, gunakan tanda kurung". Setelah itu, ada baiknya untuk meletakkan tanda kurung di sekitar satu tupel, meskipun itu bukan bagian dari sintaks tupel.
nigel222

12

Saat kamu melakukan

>>> (1,) == 1,

itu membangun tupel dengan hasil dari membandingkan tupel (1,) dengan integer dan kemudian kembali False.

Sebaliknya ketika Anda menetapkan ke variabel, dua tupel yang sama dibandingkan satu sama lain.

Anda dapat mencoba:

>>> x = 1,
>>> x
(1,)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.