Values, names, and types
Almost every beginner error is a name pointing at a value of a type you did not expect.
Everything in Python is an object with a type, and variables are just names that refer to those objects. The type determines the legal operations, so a string of digits is not a number until you convert it, and dividing two integers with / always gives you a float. When something behaves strangely, ask two questions: what does this name currently refer to, and what type is it. print(x) and type(x) answer both in two seconds.
Assignment rebinds names; it does not copy values. Two names can refer to the same mutable list, so a change through one shows up through the other. Immutable values like numbers, strings, and tuples cannot be changed in place, which is why methods like upper return a new string instead of modifying the original.
Names are luggage tags, not suitcases. Sticking a second tag on the same suitcase does not create a second suitcase, and cutting a hole in the suitcase is visible from either tag.
You write items = ["pen"], then backup = items, then items.append("pad"), then print(backup) and see both items. Fixing it means backup = items[:] or list(items), which builds a genuinely separate list.