this post was submitted on 02 Aug 2025
9 points (100.0% liked)

Python

7340 readers
49 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 7 comments
sorted by: hot top controversial new old
[–] gedhrel@lemmy.world 6 points 1 hour 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 3 points 1 hour ago (1 children)

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

[–] marcos@lemmy.world 2 points 53 minutes ago

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.

[–] marcos@lemmy.world 6 points 1 hour ago* (last edited 1 hour 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.

[–] Diplomjodler3@lemmy.world 1 points 1 hour 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.

[–] bluey@lemmy.world 0 points 1 hour ago* (last edited 1 hour 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/