if var1
equals 1
, and you run var2 = var1
, that sets var2
to 1
.
if list1
equals [
, 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 [
]
It won’t (using your example explicitly) but in general what you’ve discovered is that:
- Variables hold values
- 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).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:
>>> a = 65535 >>> b = 65535 >>> a is b False
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 changelist2
. Butlist1 = [3, 2, 1]
won’t.deleted by creator
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/
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 somebody will point it out.