Υπάρχει διαφορά μεταξύ «foo είναι None» και «foo == Καμία» εκεί;

ψήφοι
207

Υπάρχει κάποια διαφορά μεταξύ εκεί:

if foo is None: pass

και

if foo == None: pass

Η σύμβαση που έχω δει στα περισσότερα κώδικα Python (και τον κωδικό εγώ γράψω) είναι η πρώτη, αλλά τέθηκε πρόσφατα σε κώδικα που χρησιμοποιεί το τελευταίο. Κανένας είναι ένα παράδειγμα (και η μόνη περίπτωση, IIRC) της NoneType, γι 'αυτό δεν πρέπει να έχει σημασία, έτσι δεν είναι; Υπάρχουν περιπτώσεις κατά τις οποίες θα μπορούσε;

Δημοσιεύθηκε 25/08/2008 στις 17:27
πηγή χρήστη
Σε άλλες γλώσσες...                            


12 απαντήσεις

ψήφοι
239

isεπιστρέφει πάντα Trueεάν συγκρίνει το ίδιο αντικείμενο π.χ.

Εκτιμώντας τα ==τελικά καθορίζεται από την __eq__()μέθοδο

δηλαδή


>>> class Foo(object):
       def __eq__(self, other):
           return True

>>> f = Foo()
>>> f == None
True
>>> f is None
False
Απαντήθηκε 25/08/2008 στις 17:38
πηγή χρήστη

ψήφοι
47

Μπορεί να θέλετε να διαβάσετε αυτό ταυτότητας αντικειμένου και της ισοδυναμίας .

Η δήλωση «είναι» χρησιμοποιείται για την ταυτότητα αντικειμένου, ελέγχει αν τα αντικείμενα αναφέρονται στο ίδιο παράδειγμα (ίδια διεύθυνση στη μνήμη).

Και η δήλωση του «==» αναφέρεται στην ισότητα (ίδια τιμή).

Απαντήθηκε 25/08/2008 στις 17:48
πηγή χρήστη

ψήφοι
4

Για Κανένας δεν πρέπει να υπάρχει διαφορά μεταξύ της ισότητας (==) και την ταυτότητα (είναι). Η NoneType επιστρέφει κατά πάσα πιθανότητα ταυτότητα για την ισότητα. Από Καμία δεν είναι η μόνη περίπτωση που μπορείτε να κάνετε από NoneType (νομίζω ότι αυτό είναι αλήθεια), οι δύο λειτουργίες είναι οι ίδιες. Στην περίπτωση των άλλων τύπων αυτό δεν συμβαίνει πάντα. Για παράδειγμα:

list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"

Αυτό θα εκτυπώσει «Equal» από το λίστες έχουν μια λειτουργία σύγκρισης που δεν είναι η προεπιλεγμένη επιστροφή της ταυτότητας.

Απαντήθηκε 25/08/2008 στις 18:04
πηγή χρήστη

ψήφοι
4

@ Jason :

Θα ήθελα να συστήσω χρησιμοποιώντας κάτι περισσότερο προς την κατεύθυνση της

if foo:
    #foo isn't None
else:
    #foo is None

Δεν μου αρέσει να χρησιμοποιούν «αν foo:» αν foo αποτελεί πραγματικά μια δυαδική τιμή (δηλαδή 0 ή 1). Αν foo είναι ένα string ή ένα αντικείμενο ή κάτι άλλο, «αν foo:» μπορεί να λειτουργήσει, αλλά μοιάζει με ένα χαλαρό συντόμευση για μένα. Αν είστε έλεγχο για να δούμε αν το x είναι Κανένα, δηλαδή «αν το x είναι None:».

Απαντήθηκε 25/08/2008 στις 20:35
πηγή χρήστη

ψήφοι
24

Μια λέξη της προσοχής:

if foo:
  # do something

Είναι δεν είναι ακριβώς το ίδιο όπως:

if x is not None:
  # do something

Το πρώτο είναι μια boolean τεστ αξία και μπορούν να αξιολογήσουν σε ψευδείς σε διαφορετικά πλαίσια. Υπάρχουν ορισμένα πράγματα που αντιπροσωπεύουν ψευδείς σε δυαδική δοκιμές αξία, για παράδειγμα κενά εμπορευματοκιβώτια, οι λογικές τιμές. Καμία αξιολογεί επίσης ψευδής σε αυτή την κατάσταση, αλλά και άλλα πράγματα που κάνω εγώ.

Απαντήθηκε 26/08/2008 στις 12:44
πηγή χρήστη

ψήφοι
12

(ob1 is ob2) ίσο με (id(ob1) == id(ob2))

Απαντήθηκε 25/02/2009 στις 09:34
πηγή χρήστη

ψήφοι
11

Ο λόγος foo is Noneείναι ο προτιμώμενος τρόπος είναι ότι μπορεί να χειρίζεται ένα αντικείμενο που καθορίζει το δικό του __eq__, και ότι ορίζει το αντικείμενο να είναι ίση με Κανένας. Έτσι, πάντα να χρησιμοποιείτε foo is Noneαν θέλετε να δείτε αν είναι infact None.

Απαντήθηκε 28/05/2010 στις 20:15
πηγή χρήστη

ψήφοι
1

Συμπέρασμα John Machin που Noneείναι μονήρεις είναι ένα συμπέρασμα ενισχύεται από αυτόν τον κώδικα.

>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>> 

Δεδομένου ότι Noneείναι μονήρεις, x == Noneκαι x is Noneθα έχουν το ίδιο αποτέλεσμα. Ωστόσο, στην αισθητική γνώμη μου, x == Noneείναι το καλύτερο.

Απαντήθηκε 27/03/2011 στις 18:31
πηγή χρήστη

ψήφοι
2

Μερικές περισσότερες λεπτομέρειες:

  1. Η isρήτρα ελέγχει πραγματικά αν τα δύο objectες βρίσκονται στην ίδια θέση μνήμης ή όχι. δηλαδή εάν τόσο το σημείο στην ίδια θέση μνήμης και να έχουν το ίδιο id.

  2. Ως συνέπεια της 1, isεξασφαλίζει κατά πόσον ή όχι, οι δύο λεξιλογικά αντιπροσωπεύονται objects έχουν ταυτόσημες ιδιότητες (ιδιότητες-της-χαρακτηριστικά ...) ή όχι

  3. Συγκεκριμενοποίηση των πρωτόγονων τύπων όπως bool, int, string(με κάποιες εξαιρέσεις), NoneTypeπου έχουν ίδια τιμή θα είναι πάντα στην ίδια θέση μνήμης.

Π.χ

>>> int(1) is int(1)
True
>>> str("abcd") is str("abcd")
True
>>> bool(1) is bool(2)
True
>>> bool(0) is bool(0)
True
>>> bool(0)
False
>>> bool(1)
True

Και επειδή NoneTypeμπορεί να έχει μόνο μία παρουσία του ίδιου του πίνακα τον πύθωνα του «look-up» Ως εκ τούτου, ο πρώην και ο τελευταίος είναι περισσότερο από ένα στυλ προγραμματισμού του έργου που έγραψε τον κωδικό (ίσως και για τη συνοχή) και όχι στη συνέχεια, έχοντας κάθε λεπτό λογική εξήγηση για την επιλέξετε ένα πάνω στο άλλο.

Απαντήθηκε 19/05/2013 στις 14:08
πηγή χρήστη

ψήφοι
8

Δεν υπάρχει καμία διαφορά γιατί τα αντικείμενα τα οποία είναι πανομοιότυπα φυσικά θα είναι ίση. Ωστόσο, PEP 8 ορίζει σαφώς θα πρέπει να χρησιμοποιήσετε is:

Οι συγκρίσεις με τις μονήρεις, όπως Κανένα πρέπει πάντα να γίνεται με είναι ή δεν είναι, ποτέ οι φορείς ισότητας.

Απαντήθηκε 19/05/2013 στις 14:35
πηγή χρήστη

ψήφοι
5

isδοκιμασίες για την ταυτότητα, δεν ισότητας. Για τη δήλωσή σας foo is none, Python συγκρίνει απλά την διεύθυνση μνήμης των αντικειμένων. Αυτό σημαίνει ότι την ερώτηση «Έχω δύο ονόματα για το ίδιο αντικείμενο;»

==για τις άλλες δοκιμές χέρι για την ισότητα, όπως καθορίζεται από τη __eq__()μέθοδο. Δεν νοιάζεται για την ταυτότητα.

In [102]: x, y, z = 2, 2, 2.0

In [103]: id(x), id(y), id(z)
Out[103]: (38641984, 38641984, 48420880)

In [104]: x is y
Out[104]: True

In [105]: x == y
Out[105]: True

In [106]: x is z
Out[106]: False

In [107]: x == z
Out[107]: True

NoneΕίναι ένας χειριστής μονήρεις. Έτσι None is Noneείναι πάντα αλήθεια.

In [101]: None is None
Out[101]: True
Απαντήθηκε 19/12/2014 στις 02:05
πηγή χρήστη

ψήφοι
0
a is b # returns true if they a and b are true alias
a == b # returns true if they are true alias or they have values that are deemed equivalence 


a = [1,3,4]
b = a[:] #creating copy of list
a is b # if gives false
False
a == b # gives true
True
Απαντήθηκε 03/04/2019 στις 06:11
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more