If you don't need a language that's as low-level as possible, then Go is also a good language to learn. It doesn't have much to teach in the way of memory management, but it does have pointers.
C++ and Rust are both relatively complex. If you have aspirations to working on large native projects, then C++ might be the way, with Rust becoming more prevalent in the future.
I'd probably throw my vote at C for a low level language. Even if you never actually write anything in C, being able to understand the massive amount of code out there in C is a definite plus, and it gives you a good understanding of what's happening at the machine level and underneath the abstraction of other languages.
Go is not a great choice, because it's not very low level. You don't allocate and free memory explicitly, and you often work with maps, slices, and channels, which are quite high-level.
C is a reasonable choice, since the core of it is fairly simple. I expect that forty years of incremental additions have added quite a bit of cruft though, which you have to be able to see though. There also isn't very much work done in plain C these days. Most people in this space use C++, which is even more complicated.
May I ask what you are hoping to do with this skill? If you just want a chance to learn more about how computers work, an artificial assembly language like MMIX may teach you more while avoiding much of the cruft that real languages pick up as they evolve. If you actually want to use this for work, C++ is the way to go, but expect to be a beginner for a long time.
Ada.
I would really recommend learning to program in assembler. And I think the best way to do that is something like AVR [1] or ARM on an embedded device but X86 is do-able with NASM [2] [3]
There's always MIPS via SPIM [4]
Learning assembler will give you more than simply swapping one imperative language for another. Python / Java -> C / Go / Rust is really not that large a leap. You will have the basics down in a few evenings.
[1] https://en.wikipedia.org/wiki/Atmel_AVR
After you get the fundamentals down, take a look at the source code behind those runtimes, and it'll make you a much stronger programmer in all the languages you know.
For Java, you could learn C++ (via JNI) for the same reasons - but Java is less likely to use C libraries, and going from Java to C++ usually doesn't produce as much of a speedup as going from Python to C.
From my experience with learning Rust, it might be a little hard to grasp both "the low level world" and Rust-specific things at once.
I might make some kind of machine learning application in it later down the line though.
Also if you're mucking about with machine learning a lot of the libraries seem to be in C or C++. I played about a bit with computer vision using Python but sometimes the Python bindings don't work or don't exist and I was thinking it would be easier to just call the things from the C/C++ they are written in.