There's no way you can do that changing only that line. You can do:

a = [1]
b = a
a[0] = 2
b[0]

That creates a list, assigns the reference to a, then b also, uses the a reference to set the first element to 2, then accesses using the b reference variable.

Answer from Matthew Flaschen on Stack Overflow
Top answer
1 of 11
89

There's no way you can do that changing only that line. You can do:

a = [1]
b = a
a[0] = 2
b[0]

That creates a list, assigns the reference to a, then b also, uses the a reference to set the first element to 2, then accesses using the b reference variable.

2 of 11
55

I want form.data['field'] and form.field.value to always have the same value

This is feasible, because it involves decorated names and indexing -- i.e., completely different constructs from the barenames a and b that you're asking about, and for with your request is utterly impossible. Why ask for something impossible and totally different from the (possible) thing you actually want?!

Maybe you don't realize how drastically different barenames and decorated names are. When you refer to a barename a, you're getting exactly the object a was last bound to in this scope (or an exception if it wasn't bound in this scope) -- this is such a deep and fundamental aspect of Python that it can't possibly be subverted. When you refer to a decorated name x.y, you're asking an object (the object x refers to) to please supply "the y attribute" -- and in response to that request, the object can perform totally arbitrary computations (and indexing is quite similar: it also allows arbitrary computations to be performed in response).

Now, your "actual desiderata" example is mysterious because in each case two levels of indexing or attribute-getting are involved, so the subtlety you crave could be introduced in many ways. What other attributes is form.field suppose to have, for example, besides value? Without that further .value computations, possibilities would include:

class Form(object):
   ...
   def __getattr__(self, name):
       return self.data[name]

and

class Form(object):
   ...
   @property
   def data(self):
       return self.__dict__

The presence of .value suggests picking the first form, plus a kind-of-useless wrapper:

class KouWrap(object):
   def __init__(self, value):
       self.value = value

class Form(object):
   ...
   def __getattr__(self, name):
       return KouWrap(self.data[name])

If assignments such form.field.value = 23 is also supposed to set the entry in form.data, then the wrapper must become more complex indeed, and not all that useless:

class MciWrap(object):
   def __init__(self, data, k):
       self._data = data
       self._k = k
   @property
   def value(self):
       return self._data[self._k]
   @value.setter
   def value(self, v)
       self._data[self._k] = v

class Form(object):
   ...
   def __getattr__(self, name):
       return MciWrap(self.data, name)

The latter example is roughly as close as it gets, in Python, to the sense of "a pointer" as you seem to want -- but it's crucial to understand that such subtleties can ever only work with indexing and/or decorated names, never with barenames as you originally asked!

🌐
GeeksforGeeks
geeksforgeeks.org › python › using-pointers-in-python-using-ctypes
Using Pointers in Python using ctypes - GeeksforGeeks
July 23, 2025 - As the name suggests void pointer is a type of Pointer that has no specific data type associated with it. It can be typecasted into any type and can hold data of any type. Since in Python the concept of pointers is not properly available or used we can't properly create a Void Pointer, as the POINTER function requires one argument i.e the data type.
Discussions

Why doesn't Python have pointers?
What’s a pointer More on reddit.com
🌐 r/learnpython
63
128
April 21, 2023
Two-Pointer Technique, an In-Depth Guide: Concepts Explained | Questions to Try | Visuals and Animations
I really really need this so much right now thank you for making this I wish u keep making this i love it thank you! More on reddit.com
🌐 r/leetcode
16
273
December 12, 2023
Trying to understand NULL pointers
NULL is equivalent to 0 and equivalent to nullptr (in C++). It's an address that is "universally invalid." You can store 0x2093704802934 in a pointer and it will be invalid too (I'm sure) but it's not a convention. NULL is this convention that says "the pointer is not valid" and/or "the pointer hasn't been initialized yet" or "the memory pointed to has been released and I have invalidated the pointer by setting it to NULL." You store this value in a "pointer", like "int* s = 0" to show that it is not pointing to anything. And in your code you will check whether the pointer (s in my example) is equal to NULL (invalid) or not (valid). First you create a pointer, then you initialize it, then you use it, then you release it. More on reddit.com
🌐 r/learnprogramming
18
1
December 30, 2021
Can someone properly explain the relevance of double pointers to me in linked lists? I'm a little confused
Let's look at this from the caller's perspective. Assume I have the following. node_t *head = create_node(...); If I want to insert a node at the front of the list, that new node needs to become the head (head means the first node in the list). Your first function doesn't change the head, and in fact has no way to do so. You can't do this, for example node_t *insert_at_head(node_t *head, node_t *node_to_insert){ node_to_insert->next = head; head = node_to_insert; // this line is useless return node_to_insert; } void foo() { node_t *head = create_node(...); insert_at_head(head, create_node(...)); // head now points to the second node ... } Because the head inside the function is a copy of the caller's head, the assignment inside the function has no visible effect to the caller. With the second version, you can do this: node_t *insert_at_head(node_t **head, node_t *node_to_insert){ node_to_insert->next = *head; *head = node_to_insert; return node_to_insert; } void bar() { node_t *head = create_node(...); insert_at_head(&head, create_node(...)); // note the & in front of head // head has been modified, and points to the newly added node ... } Note that the first version is not necessarily wrong, it just requires manual upkeep of the head pointer on the caller's end. In fact, that's probably why it returns a value, so you can do that upkeep seamlessly, like so: void baz() { node_t *head = create_node(...); head = insert_at_head(head, create_node(...)); } With the double pointer version, you can't accidentally forget to update the value of head though. More on reddit.com
🌐 r/C_Programming
21
8
May 3, 2024
🌐
EDUCBA
educba.com › home › software development › software development tutorials › python tutorial › pointers in python
Pointers in Python | Type of Pointers | Arithmetic Operations
August 23, 2025 - Let us look now with an example ... address. ... In this example, we are declaring two variables, x and y, where y is equal to x, which now points to the same memory address as that of x....
Address: Unit no. 202, Jay Antariksh Bldg, Makwana Road, Marol, Andheri (East),, 400059, Mumbai
🌐
Real Python
realpython.com › pointers-in-python
Pointers in Python: What's the Point? – Real Python
March 18, 2026 - In this step-by-step tutorial, you'll get a clearer understanding of Python's object model and learn why pointers don't really exist in Python. You'll also cover ways to simulate pointers in Python without the memory-management nightmare.
🌐
Scaler
scaler.com › home › topics › do we have pointers in python?
Do We Have Pointers in Python? - Scaler Topics
May 4, 2023 - We can use the Python custom class in place of the dictionary. Let's take a look at an example. In the above code, the Pointer class is defined. In the _metrics member variable, this class used dict to store actual data. It will give our program flexibility.
🌐
Launch School
launchschool.com › books › python › read › variables_pointers
How Python objects and variables really work
Thus, when you access a variable, Python first determines where the variable is on the stack. It then takes the object's heap address from the stack item and uses it to find the object. The variable is a pointer to a stack location, and the stack location is a pointer to the object. Let's break that down with an example. Assume we're creating a variable named numbers and giving it an initial value of a list with 3 numbers:
Find elsewhere
🌐
Nickmccullum
nickmccullum.com › python-pointers
How to Use Python Pointers | Nick McCullum
June 13, 2020 - Examples of Python types include int, float, string, and boolean. Value is the actual value of the object that is stored in the memory. Objects in Python are of two types – Immutable and Mutable. It is important to understand the difference between immutable and mutable objects to implement pointer behavior in Python.
🌐
Anvil
anvil.works › articles › pointers-in-my-python-1
Memory Management in Python - Part 1: What Are Pointers?
For the purposes of this series of articles, we don’t need to worry about scopes; we can assume all our examples take place in the global namespace. Pointers can be thought of as names - that is, entries in Python’s namespace - that correspond to objects in Python’s memory.
🌐
TutorialsPoint
tutorialspoint.com › article › what-is-the-pointer-in-python-does-a-pointer-exist-in-python
What is the Pointer in Python? Does a Pointer Exist in Python?
April 4, 2023 - Python uses automatic garbage collection to manage memory. The garbage collector automatically deallocates objects when no variables reference them, eliminating the need for manual memory management like in C or C++. Python doesn't have explicit pointers like C or C++, but uses references to manage object access.
🌐
LearnXbyExample
learnxbyexample.com › learn x by example › python programming › pointers in python
Pointers in Python | Learn X By Example
September 21, 2024 - Lists are mutable in Python, so changes made inside the function affect the original list. In the main function, we first use an integer to show that zero_value doesn’t change the original value. Then we use a list to show that zero_reference does change the original value. Finally, we print the id of the integer, which is somewhat analogous to printing a memory address in languages with explicit pointers.
🌐
CodeSpeedy
codespeedy.com › home › understanding pointers in python
Understanding Pointers In Python - CodeSpeedy
January 30, 2020 - This shows us the example of a Pointer. Whereas on the other hand when we will consider ” x ” to be 10 which comes under the basic category of variable as explained earlier and does the following changes: ... We will still get ” y ” to be the integer value of 10 as output. This shows the concept of Pointers in Python with respect to basic and non-basic variables.
🌐
Reddit
reddit.com › r/learnpython › why doesn't python have pointers?
r/learnpython on Reddit: Why doesn't Python have pointers?
April 21, 2023 -

No, really. I've just started practicing problems on Leetcode and today I tried to do a bunch of things with Linked lists in python. I always second guess myself when I'm writing assignment statements like node = next_node because I'm worried that using shallow copies might screw things up for me.

Wouldn't it have been way easier to directly reference objects by their memory location?

I'm not going to use C for coding interviews so I'd also appreciate any ways I can idiot proof my code when I'm dealing with moving and assigning objects in Python.

One idea I had was to include a deepcopy method in the List node class definition but I can't make any changes to the leetcode question setup.

Top answer
1 of 28
219
Because it’s high level by design
2 of 28
137
Pointers are a concept that really doesn't make sense in Python, both because of practical reasons and philisophical reasons. In Python, "variables" are really "lebels" attached to objects, not a specific memory location in your address space. The internals of the Python interpreter do make use of pointers, but that's because it's written in C. Philisophically, the designers of Python view pointers as an intrinsically bad thing - they have all sorts of downsides that would have made Python a bad language. What Python has instead, is bindings - the labels I mentioned above - and they actually do behave in some ways like pointers, but without the downsides. Bindings do not have a type, but the objects they are bound to do have a type, and unlike in C, an object (i.e. a value or more complex type) can have multiple labels. Furthermore, container types like tuples, lists, and dictionaries contain references to objects, which are very like pointers: they don't have a name (binding) but they do give you a way to refer to an object - of any type. If you make a linked list element class in Python like this: class Element: def __init__(self,pred,value): self.pred = pred self.value = value That gives you a linked list with a reference to the previous Element in each object, and you can traverse the links like this: >>> a = Element(None,1) >>> b = Element(a,2) >>> c = Element(b,3) >>> c.pred.pred.value 1 >>> c.pred.value 2 Semantically, that's pretty much like pointers. Generally it's less useful to use such structures in Python, though it's still valid in some situations, but you can take advantage of references to build complex dynamic data structures you can traverse in the same way as most linked-list or tree structures in other languages.
🌐
Medium
medium.com › @gopikumarkolla7777 › understanding-pointers-in-python-mutable-vs-immutable-explained-with-simple-examples-9f157ad12e06
Understanding “Pointers” in Python: Mutable vs Immutable Explained with Simple Examples | by Gopikumarkolla | Medium
December 7, 2025 - class Person: def __init__(self, name): self.name = name p1 = Person("Alice") p2 = p1 # Same reference print(id(p1), id(p2)) # Same p2.name = "Bob" # Modifies shared object print(p1.name, p2.name) # Bob Bob p2 = Person("Charlie") # New object print(p1.name, p2.name) # Bob Charlie
🌐
Ned Batchelder
nedbatchelder.com › blog › 202403 › does_python_have_pointers
Does Python have pointers? | Ned Batchelder
March 11, 2024 - I think the power of pointers lies in referring to an object without making a copy. In your Python example, there is a copy of the object because integers are immutable.
🌐
Europython
ep2024.europython.eu › session › pointers-in-python
Pointers in Python
July 8, 2024 - Remember pointers from C/C++? Why don’t we add them to Python? Make any Python object mutable by manipulating it directly in memory through the pointer as you would do in C/C++. Why do this? Well, pointers have no use in Python, but the point is not implementation itself, but all the internal parts of Python programming language that you will touch while implementing it.
🌐
Javatpoint
javatpoint.com › pointer-in-python
Pointer in Python | Why Python doesn't support pointer - Javatpoint
Pointer in Python | Why Python doesn't support pointer with python, tutorial, tkinter, button, overview, entry, checkbutton, canvas, frame, environment set-up, first python program, operators, etc.
🌐
Medium
medium.com › better-programming › pointers-in-python-wait-is-it-possible-9e19da644e41
Pointers in Python? Wait… Is It Possible? | by Eldad Uzman | Better Programming
September 1, 2022 - Remember, strings in Python are immutable, which means we can’t change a value of a string. Instead, we can only create a new string. With pointers, we can bypass this limitation, as you can see below: ... It has been brought to my attention that the 2 addresses are not the same, and this is true. However, if we look at the following code snippet: In this example, ptr and ptr2 are referencing the same object containing the string “hello world”. If there were not pointers, once the value of one string is changed, it will be assigned to a new python memory struct and the other one remains unchanged.
🌐
Real Python
realpython.com › courses › pointers-python
Pointers and Objects in Python – Real Python
July 24, 2020 - In this video course, you'll learn about Python's object model and see why pointers don't really exist in Python. You'll also cover ways to simulate pointers in Python without managing memory.