this post was submitted on 02 Aug 2025
12 points (92.9% liked)
Python
7357 readers
57 users here now
Welcome to the Python community on the programming.dev Lemmy instance!
π Events
Past
November 2023
- PyCon Ireland 2023, 11-12th
- PyData Tel Aviv 2023 14th
October 2023
- PyConES Canarias 2023, 6-8th
- DjangoCon US 2023, 16-20th (!django π¬)
July 2023
- PyDelhi Meetup, 2nd
- PyCon Israel, 4-5th
- DFW Pythoneers, 6th
- Django Girls Abraka, 6-7th
- SciPy 2023 10-16th, Austin
- IndyPy, 11th
- Leipzig Python User Group, 11th
- Austin Python, 12th
- EuroPython 2023, 17-23rd
- Austin Python: Evening of Coding, 18th
- PyHEP.dev 2023 - "Python in HEP" Developer's Workshop, 25th
August 2023
- PyLadies Dublin, 15th
- EuroSciPy 2023, 14-18th
September 2023
- PyData Amsterdam, 14-16th
- PyCon UK, 22nd - 25th
π Python project:
- Python
- Documentation
- News & Blog
- Python Planet blog aggregator
π Python Community:
- #python IRC for general questions
- #python-dev IRC for CPython developers
- PySlackers Slack channel
- Python Discord server
- Python Weekly newsletters
- Mailing lists
- Forum
β¨ Python Ecosystem:
π Fediverse
Communities
- #python on Mastodon
- c/django on programming.dev
- c/pythorhead on lemmy.dbzer0.com
Projects
- PythΓΆrhead: a Python library for interacting with Lemmy
- Plemmy: a Python package for accessing the Lemmy API
- pylemmy pylemmy enables simple access to Lemmy's API with Python
- mastodon.py, a Python wrapper for the Mastodon API
Feeds
founded 2 years ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
It won't (using your example explicitly) but in general what you've discovered is that:
Lists fall into the second category. There are ways to copy lists if you want distinct behaviour.
will perform a "shallow copy". If you have a list of lists, however, the nested lists are still shared references. There is
copy.deepcopy
available to make a complete clone of something (including all its nested members).This. Collections (lists, dicts, tuples) behave a little differently than primitives.
Every variable in Python is actually a reference (maybe optimized out, but still logically a reference). There's no difference.
Numbers, booleans, and None won't give you that kind of problem only because you can't change them.
True. Since it's all interpreted, it doesn't act like primitives in things like C and everything is an object, that is a ref of some sort. However, there is a difference between how Python "primitives" and Python collections work within the language syntax.
Now I'm curious what differences you are talking about, because I'm no Python expert, but I can't think of any. If you mean identity representation, no, it's not different:
I was meaning how they behave in when copying and similar behavior. One basically just needs to remember that assignment of a Python primitives var to another will copy the value, whereas doing the same thing with a collection will generally make a reference instead.
As for this:
I'd expect that behavior in must programming languages. It effectively translates to:
One could test with
==
to see if the values are equivalent but, unless "b" is assigned as "a",a is b
should evaluate asfalse
because they are two different variables.Other, maybe clearer, way to inspect references
Then reserve the use of
is
for bool or None.Python has a concept of,
Just don't do that
. Which would be a great title for this topic thread.It doesn't seem to copy the value, just make another reference:
One thing I know that Python does is optimize the value away for the few smallest values of the primitives. But that's on optimizations.
Oh right! You are indeed correct. It is effectively just seeing a pointer there. What Python considers that to be is a shallow copy. But this only applies to "primitive" types. If you change the value of either, it will cease to act as a pointer to the same object but instead allocate a new one. It's a bit weird if one isn't used to all of that abstraction between oneself and the memory.
As I said, it's because you can't change the value of a primitive value. (That is, unless you abuse the C interface.)
Because Python doesn't protect classes, you just can't do the same with the types you create. But that's what is special, not the way if handles variables.
And this is different from languages like Java/C#, PHP/Perl, etc. Most imperative languages have primitive atomic values that go directly into your variables. But Python has only references (except for some complicated optimizations). Anyway, it is weird, and it's one of the reasons people should learn C or Rust eventually.