Chris Angelico <ros...@gmail.com>: > On Sat, May 10, 2014 at 3:58 PM, Gregory Ewing > <greg.ew...@canterbury.ac.nz> wrote: >> Steven D'Aprano wrote: >>> >>> some_function(x, y+1)[key].attribute[num](arg)[spam or eggs] = 42 >>> >>> I'm pretty sure that it isn't common to call the LHS of that assignment a >>> variable. > > [...] > https://en.wikipedia.org/wiki/Assignment_(computer_science) > > [...] > > So if Python has no variables, then either that article is > inappropriate, or Python has no assignment either.
Many complaints against Python's variables are really comments on Python's object model. Steven's example points out a different angle: many complaints against Python's variables are really comments on Python's assignment statement (including argument passing). In Python, x is a variable, a memory slot that can be assigned to, a[3] is a list element, a memory slot that can be assigned to, d['y'] is a dict entry, a memory slot that can be assigned to, o.f is a field, a memory slot that can be assigned to Now, Python (together with a host of other programming languages) lacks a way to pass memory slots by reference (although the list/dict+key comes close). However, the fact that you can't get a reference to a variable/list element/dict entry/field doesn't mean Python doesn't have variables/list elements/dict entries/fields. Marko PS I have mentioned before that Python 3 *does* allow you to pass a reference to any LHS by constructing an ad-hoc accessor object: x, y = 2, 3 class X: def get(self): return x def set(self, v): nonlocal x; x = v class Y: def get(self): return y def set(self, v): nonlocal y; y = v swap(X(), Y()) print(x, y) => 3, 2 Such ad-hoc accessor classes are required for nonglobal variables only. Generic accessor classes can be written for global variables, list elements, dict entries and fields. -- https://mail.python.org/mailman/listinfo/python-list