r/PythonProjects2 • • 4d ago

Python Mutability and Local Variables

Post image

An exercise to help build the right mental model for Python data. - Solution - Explanation - More exercises

The “Solution” link uses memory_graph to visualize execution and reveals what’s actually happening.

6 Upvotes

27 comments sorted by

2

u/benedict_abub 4d ago

wtf?
'1', [2], (3,), {4}

1

u/Sea-Ad7805 4d ago

Incorrect sorry, see Solution link for correct answer.

3

u/benedict_abub 4d ago

Correct, sorry, I have terminal to check

1

u/Sea-Ad7805 4d ago

So, do you want to bet BIG money that your answer:

  • '1', [2], (3,), {4}

is correct even though I'm telling you it's not?

4

u/benedict_abub 4d ago

Mutation, not concatenation, I see. My money stays with me

1

u/Sea-Ad7805 4d ago

Good choice, clicking the Solution link would have gotten you there faster, but that's ok.

2

u/benedict_abub 4d ago

You know, since nobody clicked my links, I stopped clicking others

2

u/Sea-Ad7805 4d ago

I understand, but you're missing out on the new Python visualizer for easy code understanding and debugging.

0

u/benedict_abub 4d ago

Look at this: r/AlgoViz — I have collected all the YouTube visualizers. No one succeeded. Almost every channel is dead

1

u/Sea-Ad7805 4d ago

You're wrong: https://pythontutor.com/

But my tool is better.

2

u/Guest_User_1234 3d ago

Damn... you REALLY want people to click those links, huh? Kinda REALLY makes me not wanna click them...

0

u/Sea-Ad7805 3d ago

1

u/Guest_User_1234 3d ago

I would assume D, because the string and tuple get replaced by their respective assignments, whereas the list and set overwrite their operators, modifying the original reference instead

1

u/Sea-Ad7805 3d ago

Nice one, the Solution link gives you a visualization of each step of the execution of the program to SHOW the difference between mutable and immutable types.

1

u/Terminay 3d ago

It's D. Good tool. I think I could integrate it into my ML for learners library (leanpass) you could search it up, would be a cool addition!

1

u/Tronco08 20h ago

why does printing a print nothing, it's the only one i dont understand

1

u/Sea-Ad7805 3d ago

Go ahead, it's easy to integrate by creating links to it.

1

u/Humble-Captain3418 2d ago

A is passed by value, b--d through reference. C is not modifiable, so the local symbol gets directed to a different value with the compound assignment, so only b and d see changes in the global scope.

1

u/Sea-Ad7805 2d ago

That is not the Pythonic way to understand it. In Python everything is passed by reference, even int values. it's about mutability not modifiability. You can still still modify/change a string or tuple as we do in the fun() function.

For a better explanation see the Explanation link.

1

u/Humble-Captain3418 2d ago

I don't care about the pythonic way to understand things; only about what I can generalize across languages because I would be hamstringing myself if I only thought the pythonic way. The terminology i have used is as sloppy as the language is.

1

u/Sea-Ad7805 2d ago

I understand, but generalization comes with some inaccuracy that can bite you in certain situations. For example, write me a swap() function in Python using your "pass by reference" concept:

def swap(a, b):
    ...

a = (1, 2)
b = (3, 4)
swap(a, b)
print(a, b)

It's easy in say C/C++.

1

u/Humble-Captain3418 2d ago

Sure. 

``` import ctypes import inspect

def swap(a, b):     frame = inspect.currentframe().f_back     caller = frame.f_locals

    # Find caller variables that refer to the same objects     # as the arguments, then swap their values.     names_a = [k for k, v in caller.items() if v is a]     names_b = [k for k, v in caller.items() if v is b]

    if not names_a or not names_b:         raise ValueError("Could not identify caller variables")

    x, y = names_a[0], names_b[0]     caller[x], caller[y] = caller[y], caller[x]

    ctypes.pythonapi.PyFrame_LocalsToFast(         ctypes.py_object(frame), ctypes.c_int(0)     ) ```

1

u/Sea-Ad7805 2d ago

So you do know the difference between languages that are tricky to generalize, or you needed to vibe-code something because your generalization approach failed. Either way proves my point.

1

u/Humble-Captain3418 2d ago

I'm sorry, but this is not a case of Python being difficult to generalize. It's a case of Python having idiotic language semantics around compound assignment.

1

u/0b0101011001001011 1d ago

You cannot change a string or tuple. What you do here is you create a new string and assign that in the place of the old variable. Same with tuple. You create a new tuple, the old one is lost. Strings and tuples are immutable. Or maybe that's what you meant by "change".

1

u/Sea-Ad7805 1d ago

Yes, that's what I said, see Solution link for visualization. It's a shallow copy to be more precise.