DEV Community

Super Kai (Kazuya Ito)
Super Kai (Kazuya Ito)

Posted on

Frozenset in Python (3)

Buy Me a Coffee

*Memo:

  • My post explains a frozenset (1).
  • My post explains a frozenset (2).
  • My post explains a set (1).
  • My post explains set and frozenset functions (1).

A frozenset can be unpacked with an assignment and for statement, function and * but not with ** as shown below:

v1, v2, v3 = frozenset([0, 1, 2])

print(v1, v2, v3)
# 0 1 2
Enter fullscreen mode Exit fullscreen mode
v1, *v2, v3 = frozenset([0, 1, 2, 3, 4, 5])

print(v1, v2, v3)  # 0 [1, 2, 3, 4] 5
print(v1, *v2, v3) # 0 1 2 3 4 5
Enter fullscreen mode Exit fullscreen mode
for v1, v2, v3 in frozenset([frozenset([0, 1, 2]), frozenset([3, 4, 5])]):
    print(v1, v2, v3)
# 3 4 5
# 0 1 2
Enter fullscreen mode Exit fullscreen mode
for v1, *v2, v3 in frozenset([frozenset([0, 1, 2, 3, 4, 5]),
                              frozenset([6, 7, 8, 9, 10, 11])]):
    print(v1, v2, v3)
    print(v1, *v2, v3)
# 6 [7, 8, 9, 10] 11
# 6 7 8 9 10 11
# 0 [1, 2, 3, 4] 5
# 0 1 2 3 4 5
Enter fullscreen mode Exit fullscreen mode
print(*frozenset([0, 1]), 2, *frozenset([3, 4, *frozenset([5])]))
# 0 1 2 3 4 5
Enter fullscreen mode Exit fullscreen mode
print(frozenset([*frozenset([0, 1]), 2,
                 *frozenset([3, 4, *frozenset([5])])]))
# frozenset({0, 1, 2, 3, 4, 5})
Enter fullscreen mode Exit fullscreen mode
def func(p1='a', p2='b', p3='c', p4='d', p5='e', p6='f'):
    print(p1, p2, p3, p4, p5, p6)

func()
# a b c d e f

func(*frozenset([0, 1, 2, 3]), *frozenset([4, 5]))
# 0 1 2 3 4 5
Enter fullscreen mode Exit fullscreen mode
def func(p1='a', p2='b', *args):
    print(p1, p2, args)
    print(p1, p2, *args)
    print(p1, p2, ['A', 'B', *args, 'C', 'D'])

func()
# a b ()
# a b Nothing
# a b ['A', 'B', 'C', 'D']

func(*frozenset([0, 1, 2, 3]), *frozenset([4, 5]))
# 0 1 (2, 3, 4, 5)
# 0 1 2 3 4 5
# 0 1 ['A', 'B', 2, 3, 4, 5, 'C', 'D']
Enter fullscreen mode Exit fullscreen mode

A frozenset can be continuously used through multiple variables as shown below:

A = B = C = frozenset([10, 20, 30, 40, 50]) 
                                     # Equivalent
                                     # A = frozenset([10, 20, 30, 40, 50])
                                     # B = A
                                     # C = B
print(A) # frozenset({40, 10, 50, 20, 30})
print(B) # frozenset({40, 10, 50, 20, 30})
print(C) # frozenset({40, 10, 50, 20, 30})
Enter fullscreen mode Exit fullscreen mode

A frozenset cannot be shallow-copied but can be deep-copied as shown below:

<Shallow copy>:

*Memo:

  • A and B refer to the same outer and inner frozenset.
  • is keyword can check if A and B refer to the same outer and/or inner frozenset.
  • frozenset.copy(), copy.copy() and frozenset() cannot shallow-copy a frozenset:
    • frozenset.copy() has no arguments.
import copy

A = frozenset([frozenset([0, 1, 2])])
B = A.copy()
B = copy.copy(A)
B = frozenset(A)

print(A) # frozenset({frozenset({0, 1, 2})})
print(B) # frozenset({frozenset({0, 1, 2})})

print(A is B)
# True

A = set(A).pop()
B = set(B).pop()

print(A) # frozenset({0, 1, 2})
print(B) # frozenset({0, 1, 2})

print(A is B)
# True
Enter fullscreen mode Exit fullscreen mode

<Deep copy>:

*Memo:

  • A and B refer to different outer and inner frozensets.
  • copy.deepcopy() deep-copies a frozenset.
  • copy.deepcopy() should be used because it's safe, deeply copying a frozenset while frozenset.copy(), copy.copy() and frozenset() aren't safe, shallowly copying a frozenset.
import copy

A = frozenset([frozenset([0, 1, 2])])
B = copy.deepcopy(A)

print(A) # frozenset({frozenset({0, 1, 2})})
print(B) # frozenset({frozenset({0, 1, 2})})

print(A is B)
# False

A = set(A).pop()
B = set(B).pop()

print(A) # frozenset({0, 1, 2})
print(B) # frozenset({0, 1, 2})

print(A is B)
# False
Enter fullscreen mode Exit fullscreen mode

Top comments (0)