Haunted_python_list.py

Last Edited

by

in

#!/usr/bin/env python3
"""The Haunted Python List: seven small experiments.

Companion to Network Encyclopedia's Python list aliasing article.
Python 3; standard library only. No files, network, or packages required.
Run: python3 haunted_python_list.py
"""

def the_haunted_board():
    """Expected output:
    [['X', '.', '.'], ['X', '.', '.'], ['X', '.', '.']]
    """
    board = [["."] * 3] * 3
    board[0][0] = "X"
    print(board)


def equal_or_identical():
    """Expected output:
    True
    True
    True
    False
    """
    shared = [[0] * 3] * 3
    separate = [[0] * 3 for _ in range(3)]

    print(shared[0] == shared[1])
    print(shared[0] is shared[1])
    print(separate[0] == separate[1])
    print(separate[0] is separate[1])


def independent_rows():
    """Expected output:
    [['X', '.', '.'], ['.', '.', '.'], ['.', '.', '.']]
    """
    board = [["."] * 3 for _ in range(3)]
    board[0][0] = "X"
    print(board)


def immutable_placeholders():
    """Expected output:
    [9, 0, 0]
    """
    row = [0] * 3
    row[0] = 9
    print(row)


def the_shallow_copy():
    """Expected output:
    [[9, 0], [0, 0]]
    False
    True
    """
    original = [[0, 0], [0, 0]]
    duplicate = original.copy()
    duplicate[0][0] = 9

    print(original)
    print(duplicate is original)
    print(duplicate[0] is original[0])


def the_deepcopy_twist():
    """Expected output:
    [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
    [[7, 0, 0], [7, 0, 0], [7, 0, 0]]
    False
    True
    """
    from copy import deepcopy

    original = [[0] * 3] * 3
    duplicate = deepcopy(original)
    duplicate[0][0] = 7

    print(original)
    print(duplicate)
    print(duplicate[0] is original[0])
    print(duplicate[0] is duplicate[1])


def one_ghost_escapes():
    """Expected output:
    [[9, 9, 9], [0, 5, 0], [0, 5, 0]]
    """
    board = [[0] * 3] * 3
    board[0] = [9, 9, 9]
    board[1][1] = 5
    print(board)


def main():
    demos = [
        the_haunted_board,
        equal_or_identical,
        independent_rows,
        immutable_placeholders,
        the_shallow_copy,
        the_deepcopy_twist,
        one_ghost_escapes,
    ]
    for number, demo in enumerate(demos, 1):
        print(f"\n{number}. {demo.__name__.replace('_', ' ')}")
        demo()


if __name__ == "__main__":
    main()

Search