this post was submitted on 02 Aug 2025
11 points (92.3% liked)

Python

7340 readers
45 users here now

Welcome to the Python community on the programming.dev Lemmy instance!

πŸ“… Events

PastNovember 2023

October 2023

July 2023

August 2023

September 2023

🐍 Python project:
πŸ’“ Python Community:
✨ Python Ecosystem:
🌌 Fediverse
Communities
Projects
Feeds

founded 2 years ago
MODERATORS
 

if var1 equals 1, and you run var2 = var1, that sets var2 to 1.

if list1 equals [1, 2, 3], and you run list2 = list1, that sets list2 to list1

so if you then run var1 = 2, var2 will still be 1

but if you run list1 = [3, 2, 1], list2 will give [3, 2, 1]

all 9 comments
sorted by: hot top controversial new old
[–] gedhrel@lemmy.world 14 points 13 hours ago (1 children)

It won't (using your example explicitly) but in general what you've discovered is that:

  1. Variables hold values
  2. Some of those values are references to shared mutable objects.

Lists fall into the second category. There are ways to copy lists if you want distinct behaviour.

list2 = list1[:]

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).

[–] nickwitha_k@lemmy.sdf.org 5 points 13 hours ago (1 children)

This. Collections (lists, dicts, tuples) behave a little differently than primitives.

[–] marcos@lemmy.world 3 points 12 hours ago (1 children)

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.

[–] nickwitha_k@lemmy.sdf.org 1 points 6 hours ago (1 children)

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.

[–] marcos@lemmy.world 1 points 4 hours ago

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:

>>> a = 65535
>>> b = 65535
>>> a is b
False
[–] marcos@lemmy.world 9 points 13 hours ago* (last edited 13 hours ago) (1 children)

Hum... No it won't.

It's something you only really learn from C or Rust, but your operations will set both to the same list. If you go and change the list, you will change both, but if you set one to a different list, you won't change the other list.

In other words, if you do list1.push(4), you will change list2. But list1 = [3, 2, 1] won't.

[–] bluey@lemmy.world 2 points 13 hours ago* (last edited 13 hours ago)

in first case it is pass by value. for list you are passing a reference.

https://www.geeksforgeeks.org/python/pass-by-reference-vs-value-in-python/

[–] Diplomjodler3@lemmy.world 1 points 13 hours ago

Everything's an object. A variable is a pointer to an object. var1 is a pointer to the object 1 (which is an integer). var2 is also a pointer to the same object. If you point var1 to a different object (the integer 2), that doesn't change var2. list1 is a pointer to the list object you defined. list2 is a pointer to the same object. If you change the object, both pointers still point to it.

At least that's my understanding of the whole business. If I got anything wrong, in sure summertime will point it out.