#!/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()
Haunted_python_list.py
Search