On Wed, May 26, 2021 at 12:31:07PM -0000, Shreyan Avigyan wrote:
> Reply to Paul Moore:
> 
> if some_condition:
>     constant a = 1
> else:
>     a = 2
> a = 3
> 
> Yes this is allowed. This is runtime.

Do you have any suggestions for how this should be implemented, how the 
interpreter will know at runtime whether or not the name `a` is a 
constant?



> for i in range(10):
>     constant a = []
> 
> Not sure. Though it's preferable to be runtime. Preferable is "not allowed".

That is equivalent to:

    constant a = []
    constant a = []
    constant a = []
    # seven more times


If you can't rebind constants, then that better be disallowed. Otherwise 
you have rebound the constant `a` nine times: initialised it to one list 
on the first loop, and then the next nine loops you bind the same name 
to nine different lists.


> And lists are also literals.

Lists are not literals. The documentation calls them *displays*. You 
won't find lists under "literals":

https://docs.python.org/3/reference/expressions.html#literals

but you will find them here:

https://docs.python.org/3/reference/expressions.html#list-displays

I admit that I too often wrongly refer to expressions like `[1, 2]` as a 
list literal, but that language is not technically correct for Python.



> Any Python Object that is not assigned to a variable is a literal. 

That's incorrect. When I write the expression:

    print(a*x + b)

the object returned by `a*x + b` is not assigned to anything, but it's 
not a literal.


> Python claims that itself. A preview -
> 
> [10] = [2]
> SyntaxError: Can't assign to literal here.

You are misinterpreting the error. If you look at the pointer in the 
syntax error, it points at the 10, not the list:


    >>> [10] = [2]
      File "<stdin>", line 1
        [10] = [2]
         ^
    SyntaxError: cannot assign to literal

That statement is doing sequence unpacking: it unpacks the list [2], and 
the target list [10], and tries to assign 10 = 2 which is forbidden 
because 10 is a literal, *not* because `[10]` is a literal. (It isn't.)

You can see a better example here:

    >>> [a, b, c, 10, d, e] = range(6)
      File "<stdin>", line 1
        [a, b, c, 10, d, e] = range(6)
                  ^
    SyntaxError: cannot assign to literal


-- 
Steve
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/K47EGJ63HIOHP7DDQWDP3FXX42L5ENVE/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to