{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ad3b8898-00cb-4a94-a4ea-7456dbaf15a6",
   "metadata": {},
   "source": [
    "# Lists"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "faee75a2",
   "metadata": {
    "tags": [
     "hide-input"
    ]
   },
   "outputs": [],
   "source": [
    "import sys\n",
    "from pathlib import Path\n",
    "\n",
    "current = Path.cwd()\n",
    "for parent in [current, *current.parents]:\n",
    "    if (parent / '_config.yml').exists():\n",
    "        project_root = parent  # ← Add project root, not chapters\n",
    "        break\n",
    "else:\n",
    "    project_root = Path.cwd().parent.parent\n",
    "\n",
    "sys.path.insert(0, str(project_root))\n",
    "\n",
    "from shared import thinkpython, diagram, jupyturtle, download\n",
    "\n",
    "# Register as top-level modules so direct imports work in subsequent cells\n",
    "sys.modules['thinkpython'] = thinkpython\n",
    "sys.modules['diagram'] = diagram\n",
    "sys.modules['jupyturtle'] = jupyturtle\n",
    "sys.modules['download'] = download\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "036a57a8",
   "metadata": {},
   "source": [
    "This chapter presents one of Python's most useful built-in types, lists.\n",
    "You will also learn more about objects and what can happen when multiple variables refer to the same object."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3a99b3f4",
   "metadata": {},
   "source": [
    "<h2>Learning Objectives</h2>\n",
    "\n",
    "By the end of this chapter, you should be able to:\n",
    "\n",
    "- Construct and manipulate Python lists using indexing, slicing (including advanced step slices), and core list methods.\n",
    "\n",
    "- Explain and reason about object identity, aliasing, shallow vs. deep copies, and how lists behave when passed to functions.\n",
    "\n",
    "- Use lists idiomatically in Python: list comprehensions, unpacking and starred expressions, `enumerate()`, `zip()`, and basic sorting/looping patterns."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "56175812-24e1-425f-9330-3736c42adb56",
   "metadata": {},
   "source": [
    "<h2>Introduction to Lists</h2>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4d32b3e2",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "<h2>What is a List?</h2>\n",
    "\n",
    "If you're familiar with other programming languages, Python lists are similar to arrays in languages like Java, C++, or JavaScript. However, Python lists are more flexible: they can grow or shrink dynamically and can contain mixed data types.\n",
    "\n",
    "A Python **list** is a **sequence** data type, like strings and tuples. Sequences are: \n",
    "- ordered collections that support \n",
    "- indexing, \n",
    "- slicing, \n",
    "- `len()`, `in` membership testing, and \n",
    "- iteration. \n",
    "\n",
    "The key distinction is mutability and heterogeneous element data types: \n",
    "- In a string, the values are characters; in a list, they can be **any type**. The value literals in a list are called **elements**.\n",
    "- Lists are **mutable**, meaning they can be modified after creation. \n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf597fe5-d948-4877-8542-8f23baaaf004",
   "metadata": {},
   "source": [
    "The following figure shows the state diagram for `fruits`, `numbers` and `empty`. **Lists are objects** in Python's memory. When you create a list, Python creates a **list object** that holds your data in a specific order, and the variable holds a **reference** to that object.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "930eb109",
   "metadata": {},
   "outputs": [],
   "source": [
    "numbers = [42, 123]\n",
    "fruits = ['apple', 'banana', 'cherry']\n",
    "empty = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "25582cad",
   "metadata": {
    "tags": [
     "remove-input"
    ]
   },
   "outputs": [],
   "source": [
    "numbers = [42, 123]\n",
    "fruits = ['apple', 'banana', 'cherry']\n",
    "empty = []\n",
    "from shared.diagram import make_list, Binding, Value\n",
    "\n",
    "list1 = make_list(fruits, dy=-0.3, offsetx=0.17)\n",
    "binding1 = Binding(Value('fruits'), list1)\n",
    "\n",
    "list2 = make_list(numbers, dy=-0.3, offsetx=0.17)\n",
    "binding2 = Binding(Value('numbers'), list2)\n",
    "\n",
    "list3 = make_list(empty, dy=-0.3, offsetx=0.1)\n",
    "binding3 = Binding(Value('empty'), list3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "925c7d67",
   "metadata": {
    "tags": [
     "remove-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 366x188 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from shared.diagram import diagram, adjust, Bbox\n",
    "\n",
    "width, height, x, y = [3.66, 1.88, 0.45, 1.2]\n",
    "ax = diagram(width, height)\n",
    "bbox1 = binding1.draw(ax, x, y)\n",
    "bbox2 = binding2.draw(ax, x+2.25, y)\n",
    "bbox3 = binding3.draw(ax, x+2.25, y-1.0)\n",
    "\n",
    "bbox = Bbox.union([bbox1, bbox2, bbox3])\n",
    "#adjust(x, y, bbox)"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Tags",
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
