472,131 Members | 1,403 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,131 software developers and data experts.

SyntaxError: can't assign to a function call

What gives ?
a = []
def f(): return a
f() [] a.append(3)
f() [3] a += [3]
a [3, 3] f() [3, 3] f() += [4] SyntaxError: can't assign to function call


Fuzzyman
http://www.voidspace.org.uk/python/index.shtml

Feb 26 '06 #1
6 23940
Fuzzyman <fu******@gmail.com> wrote:
What gives ?

...
a = []
def f(): return a

...
f() += [4]

SyntaxError: can't assign to function call


Exactly what the error message says: it's syntactically forbidden to
perform any assignment on a function-call.

If you're keen on these semantics, use for example

f().extend([4])

which IS quite legal (or, if you know the RHS list has only one item,
f().append(4) is clearer and more effective).
Alex
Feb 27 '06 #2
"Fuzzyman" <fu******@gmail.com> writes:
f() += [4] SyntaxError: can't assign to function call


It's obvious that that line gives you a syntax error. += is the increment
operator overloaded for strings and lists and so on. It changes the lhs in
place appending the rhs. In this case the rhs is a function call so... how the
compiler knows how to assign to a function call?

Do the things easily:

- x = f()
- x += [4]

:)

--
Lawrence - http://www.oluyede.org/blog
"Anyone can freely use whatever he wants but the light at the end
of the tunnel for most of his problems is Python"
Feb 27 '06 #3

Alex Martelli wrote:
Fuzzyman <fu******@gmail.com> wrote:
What gives ? ...
>> a = []
>> def f():

return a

...
>> f() += [4]

SyntaxError: can't assign to function call


Exactly what the error message says: it's syntactically forbidden to
perform any assignment on a function-call.

If you're keen on these semantics, use for example

f().extend([4])


Cool, thanks. That's what I did, it's just not an error I'd seen
before. Everywhere else Python evaluates the function call and then
does it's stuff with the result.

All the best,

Fuzzyman
which IS quite legal (or, if you know the RHS list has only one item,
f().append(4) is clearer and more effective).
Alex


Feb 27 '06 #4
Fuzzyman <fu******@gmail.com> wrote:
...
Exactly what the error message says: it's syntactically forbidden to
perform any assignment on a function-call.
... Cool, thanks. That's what I did, it's just not an error I'd seen
before. Everywhere else Python evaluates the function call and then
does it's stuff with the result.


Not sure what you mean by 'everywhere else'; generally and syntactically
speaking, you can use a function-call, more or less, in all the places,
and only the places, in which you could use a constant (literal) list
such as [2] -- you can't assign to it, you can't use it as the x in 'for
x in ...', in a clause "except x, y:" you can (syntactically) use it as
x but not as y, etc. Basically, wherever Python needs a rebindable name
or other rebindable reference, you cannot substitute a function call,
nor a constant (literal) list (nor any of several other possible
literals and other expressionforms).

Wherever Python just needs a value, not a rebindable whatever, then of
course you can supply that value in whatever syntax form suits you best,
including a function-call, a literal, and many other ways besides.
Alex
Feb 27 '06 #5
"Fuzzyman" <fu******@gmail.com> wrote:

Alex Martelli wrote:
Fuzzyman <fu******@gmail.com> wrote:
> What gives ?

...
> >>> a = []
> >>> def f():
> return a

...
> >>> f() += [4]
> SyntaxError: can't assign to function call


Exactly what the error message says: it's syntactically forbidden to
perform any assignment on a function-call.

If you're keen on these semantics, use for example

f().extend([4])


Cool, thanks. That's what I did, it's just not an error I'd seen
before. Everywhere else Python evaluates the function call and then
does it's stuff with the result.


One thing that can be helpful in situations like this is to remember that
+= in Python isn't quite as "special" as it is in C. So,

f() += [4]

is the same as

f() = f() + [4]

and I think you can see why that is a problem.
--
- Tim Roberts, ti**@probo.com
Providenza & Boekelheide, Inc.
Feb 27 '06 #6
In article <on********************************@4ax.com>,
Tim Roberts <ti**@probo.com> wrote:

One thing that can be helpful in situations like this is to remember that
+= in Python isn't quite as "special" as it is in C. So,

f() += [4]

is the same as

f() = f() + [4]

and I think you can see why that is a problem.


Actually, it's not quite the same as the expansion, either:
a=[1]
b=a
a+=[2]
a is b 1 a = a + [3]
a is b 0 a [1, 2, 3] b

[1, 2]
--
Aahz (aa**@pythoncraft.com) <*> http://www.pythoncraft.com/

"19. A language that doesn't affect the way you think about programming,
is not worth knowing." --Alan Perlis
Mar 1 '06 #7

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

34 posts views Thread by Srinu | last post: by
16 posts views Thread by maehhheeyy | last post: by
1 post views Thread by Emile van Sebille | last post: by
reply views Thread by leo001 | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.