কেন "[মিথ্যা, সত্য]" তে (সত্য নয়) মিথ্যা ফিরিয়ে দেয়?


483

আমি যদি এটি করি:

>>> False in [False, True]
True

যে ফিরে আসে True। কেবল কারণ Falseতালিকায় আছে।

তবে আমি যদি:

>>> not(True) in [False, True]
False

যে ফিরে আসে False। যেহেতুnot(True) সমান False:

>>> not(True)
False

কেন?


1
সংশ্লিষ্ট stackoverflow.com/questions/31354429/...
Kasramvd

2
আপনার বন্ধনীগুলি বিভ্রান্ত করছেnot(True) in [False, True]
গ্রিজেশ চৌহান

উত্তর:


730

অপারেটর প্রাধান্য 2.x , 3.x । এর নজির এর notচেয়ে কম in। সুতরাং এটি সমান:

>>> not ((True) in [False, True])
False

এটাই তুমি চাও:

>>> (not True) in [False, True]
True

যেমন @ বেন উল্লেখ করেছেন: এটি কখনই লিখবেন না not(True), পছন্দ করুন not True। প্রাক্তন এটি ফাংশন কলের মতো দেখায়, যখন notঅপারেটর থাকে, কোনও ফাংশন নয়।


279
@ টেক্সম ৫১২: আমি কখনও লেখার পরামর্শ দিচ্ছি না not(True); পছন্দ করা not True। প্রথমটি এটি কোনও ফাংশন কলের মতো দেখায়, যা থেকে আপনার বিভ্রান্তি এসেছে; যদি notএকটি ফাংশন ছিল, তাহলে not(True) in ...সম্ভবত হতে পারে না not ((True) in ...)। আপনাকে এটি অপারেটর (বা আপনার মতো পরিস্থিতিতে শেষ হবে) জানতে হবে, সুতরাং আপনাকে এটি একটি অপারেটরের মতো লিখতে হবে, এটি কোনও ফাংশন হিসাবে ছদ্মবেশ ধারণ করবেন না।
বেন

7
এছাড়াও, যদি আপনি পাঠকের সুবিধার জন্য প্রাধান্য নির্দেশ করতে স্পেসিং ব্যবহার করতে চলেছেন তবে প্রথমে নিশ্চিত হয়ে নিন যে আপনি ঠিক আছেন। এটি লিখতে সম্ভবত ঠিক আছে a + b*c + d, এটি লিখতে খুব খারাপ a+b * c+d। সুতরাং not(True)যে পরিমাপ দ্বারা খারাপ।
স্টিভ জেসোপ

32
আসলে, কখনও লিখুন নাnot TrueFalseপরিবর্তে লিখুন ।
দারখোগ

10
সম্ভবত বাস্তব জীবনে আপনি লেখার হবে না not True, আপনি ভালো কিছু লেখার চাই not myfunc(x,y,z)যেখানে myfuncকিছু ফাংশন যা রিটার্ন হয় Trueবা False
নেট সি কে

3
@ বেনসি.আর. লেজিগেরিও মূল উত্তরটিতে আমি এটি করেছি এবং অন্যরা এটি সংশোধন করেছে। বর্তমান সংস্করণটি আমার পক্ষে যথেষ্ট স্পষ্ট, আমি মনে করি না যে রিডান্ট্যান্ট প্রথম বন্ধনী ছাড়া এটি বোঝা শক্ত নয়, যেহেতু মূল সমস্যাটি চিহ্নিত করা হয়েছে, বাকিটি বোঝা একজন প্রোগ্রামারের প্রাথমিক দক্ষতা।
ইউ হাও

76

not x in y হিসাবে মূল্যায়ন করা হয় x not in y

কোডটি বিযুক্ত করে ঠিক কী ঘটছে তা আপনি দেখতে পাচ্ছেন। প্রথম কেসটি আপনার প্রত্যাশার মতো কাজ করে:

>>> x = lambda: False in [False, True]
>>> dis.dis(x)
  1           0 LOAD_GLOBAL              0 (False)
              3 LOAD_GLOBAL              0 (False)
              6 LOAD_GLOBAL              1 (True)
              9 BUILD_LIST               2
             12 COMPARE_OP               6 (in)
             15 RETURN_VALUE

দ্বিতীয় কেসটি True not in [False, True]যা মূল্যায়ন করে তা Falseপরিষ্কার:

>>> x = lambda: not(True) in [False, True]
>>> dis.dis(x)
  1           0 LOAD_GLOBAL              0 (True)
              3 LOAD_GLOBAL              1 (False)
              6 LOAD_GLOBAL              0 (True)
              9 BUILD_LIST               2
             12 COMPARE_OP               7 (not in)
             15 RETURN_VALUE        
>>> 

পরিবর্তে আপনি (not(True)) in [False, True]যা প্রকাশ করতে চেয়েছিলেন তা হ'ল , যা প্রত্যাশা অনুযায়ী Trueএবং আপনি দেখতে পারেন কেন:

>>> x = lambda: (not(True)) in [False, True]
>>> dis.dis(x)
  1           0 LOAD_GLOBAL              0 (True)
              3 UNARY_NOT           
              4 LOAD_GLOBAL              1 (False)
              7 LOAD_GLOBAL              0 (True)
             10 BUILD_LIST               2
             13 COMPARE_OP               6 (in)
             16 RETURN_VALUE        

13
সেখানে সবসময় একটি লোক থাকে disতবে এটি একটি অত্যন্ত মূল্যবান উত্তর কারণ এটি দেখায় যে বাস্তবে not inব্যবহৃত হয়েছিল
জামিলাক

21
বাইটকোড সিপিথন দোভাষী এর একটি বাস্তবায়ন বিশদ। এটি পাইথন প্রশ্নের সিপিথন উত্তর, বাস্তবে এটি সরাসরি ভাষার রেফারেন্স থেকে আরও ভাল উত্তর দেওয়া যায়।
Wim

5
@ উইম আমি যুক্তি দিয়ে বলব যে বাইটকোড বাস্তবায়ন প্রকৃত উদাসীনতার মতো গুরুত্বপূর্ণ নয়। অন্যান্য বাস্তবায়নগুলি কার্যত অভিন্ন কিছু তৈরি করার গ্যারান্টিযুক্ত, সুতরাং একটি বিচ্ছিন্নতা বোঝার ফলে "কেন" বোঝার পক্ষে যথেষ্ট অন্তর্দৃষ্টি দেওয়া হয় এবং নিম্ন স্তরের "কীভাবে" তা বোঝার পক্ষে নয়।
অ্যালেক্স পানা

36

অপারেটর প্রাধান্য। inএর চেয়ে বেশি শক্তভাবে বাঁধা not, তাই আপনার অভিব্যক্তি সমান not((True) in [False, True])


33

এটি অপারেটর অগ্রাধিকার সম্পর্কে (এর inচেয়ে শক্তিশালী not)। তবে সঠিক জায়গায় প্রথম বন্ধনী যুক্ত করে এটি সংশোধন করা যায়:

(not(True)) in [False, True]  # prints true

লেখা:

not(True) in [False, True]

একই মত:

not((True) in [False, True])

যা Trueতালিকায় রয়েছে কিনা দেখায় এবং ফলাফলটির "না" দেয়।


14

এটা তোলে যেমন মূল্যায়ন করা হয় not True in [False, True], যা আয় Falseকারণ Trueরয়েছে[False, True]

যদি তুমি চেষ্টা কর

>>>(not(True)) in [False, True]
True

আপনি প্রত্যাশিত ফলাফল পেতে।


13

অন্যান্য উত্তরের সাথে উল্লেখ করা হয়েছে যে এর নজিরটির notচেয়ে কম রয়েছে in, আসলে আপনার বক্তব্যটি সমান:

not (True in [False, True])

তবে মনে রাখবেন যে আপনি যদি নিজের অবস্থাটি অন্যগুলির থেকে পৃথক না করেন তবে অজগরটি পৃথক করতে 2 টি ভূমিকা ( precedenceবা chaining) ব্যবহার করবে এবং এই ক্ষেত্রে অজগরটি প্রাধান্য ব্যবহার করবে। এছাড়াও, মনে রাখবেন যে আপনি যদি কোনও শর্ত পৃথক করতে চান তবে কেবলমাত্র বস্তু বা মান নয়, আপনাকে সমস্ত শর্ত বন্ধনীতে রাখা দরকার:

(not True) in [False, True]

তবে যেমনটি উল্লেখ করা হয়েছে, অপারেটরগুলিতে অজগর দ্বারা আরও একটি পরিবর্তন রয়েছে যা শৃঙ্খলিত হচ্ছে :

পাইথন ডকুমেন্টেশনের ভিত্তিতে :

নোট করুন যে তুলনা, সদস্যপদ পরীক্ষা, এবং পরিচয় পরীক্ষা, সবগুলিরই একই নজির রয়েছে এবং তুলনা বিভাগে বর্ণিত হিসাবে বাম থেকে ডান চেইন বৈশিষ্ট্য রয়েছে।

উদাহরণস্বরূপ নিম্নলিখিত বিবৃতি ফলাফল False:

>>> True == False in [False, True]
False

কারণ পাইথন নীচের মতো বিবৃতিগুলিকে শৃঙ্খলিত করবে:

(True == False) and (False in [False, True])

যা হ'ল False and TrueএটিFalse

আপনি ধরে নিতে পারেন যে কেন্দ্রীয় অবজেক্টটি 2 টি অপারেশন এবং অন্যান্য অবজেক্টের (এই ক্ষেত্রে মিথ্যা) মধ্যে ভাগ করা হবে।

এবং নোট করুন যে এটি সমস্ত তুলনামূলক ক্ষেত্রে সত্য, এটি সদস্যতা পরীক্ষা এবং পরিচয় পরীক্ষার ক্রিয়াকলাপগুলি অন্তর্ভুক্ত যা অপারেশনগুলি অনুসরণ করে:

in, not in, is, is not, <, <=, >, >=, !=, ==

উদাহরণ:

>>> 1 in [1,2] == True
False

আর একটি বিখ্যাত উদাহরণ সংখ্যা পরিসর:

7<x<20

যা সমান:

7<x and x<20   

6

আসুন এটি একটি সংগ্রহের কন্টেন্ট চেকিং অপারেশন হিসাবে দেখা যাক: [False, True]কিছু উপাদান যুক্ত একটি তালিকা।

এক্সপ্রেশনটি True in [False, True]ফিরে আসে True, যেমন তালিকায় Trueথাকা একটি উপাদান।

অতএব, উপরের অভিব্যক্তিটির ফলাফল not True in [False, True]"বুলিয়ান বিপরীত" দেয় not( অপারেটরের inচেয়ে বেশি অগ্রাধিকার হিসাবে অগ্রাধিকার সংরক্ষণের জন্য কোনও বন্ধনী ছাড়াই not)। অতএব, not Trueফলাফল হবেFalse

অন্যদিকে (not True) in [False, True], এর সমান False in [False, True], যা True( Falseতালিকায় রয়েছে)।


6

অন্য কয়েকটি জবাব সম্পর্কে স্পষ্ট করে বলতে গেলে, আনরি অপারেটরের পরে বন্ধনী যুক্ত করা তার অগ্রাধিকার পরিবর্তন করে না। আরও শক্ত করে বাঁধাই not(True)করে না । এটি প্রায় প্রথম বন্ধনী শুধু একটি অপ্রয়োজনীয় সেট । এটি অনেকটা একইরকম । প্রথম বন্ধনীগুলি কিছুই করে না। আপনি যদি এই বাঁধাইটিকে আরও বেশি শক্ত করতে চান তবে আপনাকে পুরো এক্সপ্রেশনটির চারপাশে প্যারেন্টেসিসগুলি রাখতে হবে, যার অর্থ অপারেটর এবং অপারেন্ড উভয়ই,notTrueTrue(True) in [True, False](not True) in [True, False] ,।

এটি অন্যভাবে দেখতে, বিবেচনা করুন

>>> -2**2
-4

**এর চেয়ে বেশি শক্তভাবে আবদ্ধ -হয়, এজন্য আপনি দুটি বর্গক্ষেত্রের নেতিবাচক পান, নেতিবাচক দুটিয়ের বর্গ নয় (যা ইতিবাচক চার হবে)।

আপনি যদি দুটি নেতিবাচক বর্গ চান? স্পষ্টতই, আপনি প্রথম বন্ধনী যুক্ত করবেন:

>>> (-2)**2
4

তবে, নিম্নলিখিতগুলি দেওয়া আশা করা যুক্তিসঙ্গত নয় 4

>>> -(2)**2
-4

কারণ -(2)হিসাবে একই -2। বন্ধনীগুলি একেবারে কিছুই করে না। not(True)ঠিক একই।

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