পাইথনে "(1,) == 1," এর অর্থ কী?


119

আমি টিউপল স্ট্রাকচারটি পরীক্ষা করছি এবং আমি ==অপারেটরটি যখন ব্যবহার করি তখন এটি অদ্ভুত বলে মনে হয়েছিল:

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

আমি যখন এই দুটি এক্সপ্রেশনটি একটি ভেরিয়েবলের জন্য নির্ধারণ করি তখন ফলাফলটি সত্য:

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

এই প্রশ্নাগুলি আমার দৃষ্টিতে পাইথন টিপল ট্রেইলিং কমা সিনট্যাক্স নিয়ম থেকে পৃথক । আমি ==অপারেটরের মধ্যে প্রকাশের গ্রুপটি জিজ্ঞাসা করি ।


16
একটি সময়ে খুঁজছি পূর্ববর্তী প্রশ্ন ওপি দ্বারা শুধু 2 ঘন্টা আগে, মনে হচ্ছে বিস্ময়কর (অথবা অদ্ভুত) যে কিভাবে মাত্র ভিন্নভাবে (ও সম্প্রদায়ের মধ্যে গ্রহণযোগ্যতা) একটি প্রশ্নই কাঠামোবদ্ধ ভিন্ন ফলাফল হতে পারে।
একেএস

24
@ কেএস এগুলি আলাদা আলাদা প্রশ্ন
কুমার্ক

7
@ কেএসএস প্রশ্নগুলি এখানে সামান্য আলাদা হলেও আমি আপনার বক্তব্যটির সাথে সম্পূর্ণ সম্মত। হার্ড এফেক্ট ওরফে এইচএনকিউ।
উন্মাদ

5
@ পাইথন নিউহ্যান্ড এবং সত্যই, এটি সম্পূর্ণরূপে গ্রহণযোগ্য। এজন্য আমি যুক্ত করেছি যে একটি প্রশ্ন আলাদাভাবে তৈরি করা
একেএস

3
@ CiroSantilli- কে অনুসরণ করছেন? আমি এই উত্তরগুলি ঝাঁকিয়েছি এবং এমন কোনও কিছুই দেখিনি যা দেখে মনে হচ্ছে এই বিশেষ পরিস্থিতিটি coverাকা পড়ে।
ড্যান গেটেজ

উত্তর:


88

অন্যান্য উত্তরগুলি ইতিমধ্যে আপনাকে দেখিয়েছে যে আচরণটি অপারেটর অগ্রাধিকারের কারণে এখানে ডকুমেন্টেড রয়েছে

আমি আপনাকে দেখাতে যাচ্ছি যে আপনি কীভাবে উত্তরটি পরের বার খুঁজে পেতে পারেন যখন আপনার এর মতো একটি প্রশ্ন রয়েছে। আপনি astমডিউলটি ব্যবহার করে কীভাবে এক্সপ্রেশনটি পার্স করে তা ডিকনস্ট্রাক্ট করতে পারেন :

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

এটি থেকে আমরা দেখতে পাচ্ছি যে টিম পিটারস ব্যাখ্যা করার সাথে সাথে কোডটি বিশ্লেষণ করা হয়েছে :

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

1
আর একটি দরকারী সরঞ্জাম হ'ল dis- এই ক্ষেত্রে, আপনি দুটি LOAD_CONSTভিন্ন মান ( (1,)এবং 1) এবং একটি বিভক্ত কোড সহ দেখতে পাবেন BUILD_TUPLE
মিগিলসন

153

এটি কেবল অপারেটর অগ্রাধিকার। তোমার প্রথম

(1,) == 1,

গোষ্ঠীগুলি যেমন:

((1,) == 1),

সুতরাং সমতাটির জন্য এক-উপাদানটির টিউলটিকে 1,পূর্ণসংখ্যার সাথে তুলনা করার ফলাফল থেকে একক উপাদানের সাথে একটি টিউপল তৈরি করে 1তারা সমান নয়, সুতরাং False,ফলাফলের জন্য আপনি 1-টিউপল পান।


61
আসলেই নয়, তবে 1-টিপলগুলিতে অদ্ভুত বাক্য গঠন রয়েছে। সাধারণভাবে, আপনি অনেক বেশী থাকে, অবাক হবো, যেমন 1+2, 2==3, 4*7করেনি না দল হিসেবে (1+2), (2==3), (4*7)। অনুশীলনে, 1-টিপলগুলি খুব কমই ব্যবহৃত হয় (ভাল, স্ট্যাকওভারফ্লো প্রশ্নগুলির বাইরে ;-))।
টিম পিটার্স

6
"অপ্রত্যাশিত" এর চেয়ে সম্ভবত "অপ্রত্যাশিত" ব্যবহার করা আরও ভাল শব্দ হতে পারে। আপনার দৃষ্টিভঙ্গি এবং ফোকাসের উপর নির্ভর করে আমি এমন কিছু আঁকাগুলির দিকে নজর দিচ্ছি যা দুটি জিনিস হতে পারে । সমতা অপারেটর কমা তুলনায় এত বড় এটা উপর ফোকাস এবং অনুমান ফল কী হবে খুবই সহজ True/ False। এখন যা আমি বুঝতে পেরেছি যে এটি ঘটছে, এটি পুরোপুরি স্পষ্ট এবং যুক্তিসঙ্গত।
skrrgwasme

31
এবং এখন আপনি জানেন যে "পাইথনের জেন" বলতে কী বোঝায় যে এটি করার একটি সুস্পষ্ট উপায় "আপনি ডাচ না হলে" প্রথমে সুস্পষ্ট নাও হতে পারে ";-)
টিম পিটার্স

7
আপনি যখন ডকটি পড়েন তখন কিছুটা বিভ্রান্তি হয় এবং দেখেন যে একটি টিপলকে কমা বলে তা নয়, প্রথম বন্ধনী! সুতরাং এই বিবৃতিতে ডান হাতে কমাটি পরীক্ষার অংশ হিসাবে বিবেচিত হয় না তবে এটি পৃথককারী হিসাবে বিবেচিত হয়! অপ্রত্যাশিত আচরণ!
ইকরা_5

3
এক্সপ্রেশন সম্পর্কে সাধারণ পরামর্শ হ'ল সন্দেহ যখন, প্রথম বন্ধনী ব্যবহার করুন "। এরপরে, টিউপল সিনট্যাক্সের অংশ না হলেও, সমস্ত ওয়ান-টিপলসের চারপাশে প্রথম বন্ধনী স্থাপন করা ভাল।
নিগেল 222

12

যখন তুমি কর

>>> (1,) == 1,

এটি একটি পূর্ণসংখ্যার সাথে টিপলটির তুলনা করে এভাবে ফিরে আসার ফলে একটি টিপল তৈরি করে ।(1,)False

পরিবর্তে যখন আপনি ভেরিয়েবলগুলি বরাদ্দ করেন, দুটি সমান টিপল একে অপরের সাথে তুলনা করা হয়।

আপনি চেষ্টা করতে পারেন:

>>> x = 1,
>>> x
(1,)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.