Return value of an assignment statement?
bruno.desthuilliers at gmail.com
bruno.desthuilliers at gmail.com
Thu Feb 21 18:29:02 EST 2008
On 21 fév, 23:19, John Henry <john106he... at hotmail.com> wrote:
> On Feb 21, 2:06 pm, Jeff Schwab <j... at schwabcenter.com> wrote:
>
>
>
> > John Henry wrote:
> > > On Feb 21, 1:48 pm, John Henry <john106he... at hotmail.com> wrote:
> > >> On Feb 21, 1:43 pm, mrstephengross <mrstevegr... at gmail.com> wrote:
>
> > >>> Hi all. In C, an assignment statement returns the value assigned. For
> > >>> instance:
> > >>> int x
> > >>> int y = (x = 3)
> > >>> In the above example, (x=3) returns 3, which is assigned to y.
> > >>> In python, as far as I can tell, assignment statements don't return
> > >>> anything:
> > >>> y = (x = 3)
> > >>> The above example generates a SyntaxError.
> > >>> Is this correct? I just want to make sure I've understood the
> > >>> semantics.
> > >>> Thanks,
> > >>> --Steve
> > >> That's true, and I am happy that they decided to make that a syntax
> > >> error.
>
> > > BTW: The less obvious issues when coming from the C world are Python
> > > syntax like these:
>
> > > y = x = 3
>
> > > a = 4
>
> > > y = x = a
>
> > > print x,y
>
> > > a = 5
>
> > > print x,y
>
> > That's the same behavior I would expect in C, on the grounds that C
> > assignments do bit-wise copies. What I found confusing at first was
> > that the same variable will either directly store or merely refer to an
> > object, depending on the type of the object:
>
> > >>> a = [ 'hello' ]
> > >>> y = x = a
> > >>> a += [ 'world' ]
> > >>> print x, y
> > ['hello', 'world'] ['hello', 'world']
>
> Yep. Took me a while to realize there is mutable objects, and non-
> mutable objects. To be honest, I am still not too comfortable about
> it. For instance, I still get nervous for code like:
>
> def invoke_some_fct(parent):
> y = parent.x
> y += [ 'world' ]
> print y, parent.x
>
> class abc:
> def __init__(self):
> self.x=[ 'hello' ]
> invoke_some_fct(self)
> print self.x
>
Explicitely using list.extend would make things clearer:
def invoke_some_fct(parent):
parent.x.extend(['world'])
Now there's no reason to feel nervous about this. All you have to
remember is that Python never copy anything unless explicitely asked
for.
More information about the Python-list
mailing list