Steven D'Aprano <[email protected]> added the comment:
Python is a programming language, and we're probably not going to care too much
about compliance with ZFC set theory unless there is good *practical* and not
theoretical reason to care. That's not to say that we want to break ZFC, only
that if we do so, we won't lose any sleep over it.
And it certainly won't mean that 3 == 2 as you suggest.
But fortunately, we haven't violated ZFC and this is not a bug in Python.
You've made two serious errors in your code. The first is that your second line
of code:
y = frozenset(frozenset())
doesn't do what you think it does. It doesn't create a [frozen]set of a
[frozen]set, (a nested set). It creates a simple, non-nested set. Printing the
value of y in the interactive interpreter would have shown you that it was a
plain old non-nested empty set:
py> print(y)
frozenset()
The code you want is something like:
y = frozenset([frozenset()])
for reasons which I hope will become clear. The code you are actually using is
equivalent to:
temp = set() # mutable (non-frozen)
for x in frozenset(): # loop over the contents of the inner frozenset
temp.add(x) # since that inner set is empty, nothing gets added
y = frozenset(temp) # an empty frozenset
Your second error is using the `is` operator when you are talking about
equality. The `is` operator tests for object identity, not equality, and the
Python interpreter reserves the right to re-use objects when appropriate. In
this case, the interpreter sees that it has two empty frozensets, and since
they are indistinguishable and immutable, it saves memory by using the same
object for both.
(To put it another way: the interpreter caches certain immutable objects to
save memory, and empty frozensets happen to be included.)
Of course had you used `==` rather than `is` you would have got the same
result, since two empty sets are equal, but the point still stands that you
shouldn't use object identity when you mean equality.
Once we fix the bugs in your code, we see that ZFC is saved:
py> x = frozenset() # empty set
py> y = frozenset([frozenset()]) # non-empty set
py> print(len(x), len(y))
0 1
py> x == y
False
----------
nosy: +steven.daprano
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue36507>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com