So in Python you can do the following:
def append(_list):
_list.append(1)
_list = [0]
append(_list)
print(_list)
This obviously allows me to append 1 to the list, however if I change the reference of list within the append function it doesn't change (which is as expected due to Pass-by-Object-reference). Java works similar however it's considered Pass-by-Reference. Does this simply mean that Python is like C++ when it passes a pointer that points to an object by value and then dereferences (sort of like when using C/C++'s -> operator)?
In Python everything is a reference to the heap. In Java, you can have primitive types that live on the stack that aren't references to anything on the heap, but everything else is a reference to objects on the heap (even arrays of primitives).
During a function call, the reference (or primitive) is copied to the new stack frame in both Java and Python.
C can put complex structures, (like structs and arrays) on the stack. But there is no notion of stack objects that aren't references in Python. This is very different than in C, where you can not only copy an object to the new stack frame, but you can instead actually pass a pointer to an object that lives on an earlier stack frame.