Ah yes, I see what you mean:

class Test():
       x = 1
       print (x)                         # Prints 1
       print([x+i for i in range(1,3)])  # NameError (x)

Anyway, I  apologise for posting to Python-Dev on was a known issue, and turned out to be more me asking for help with development with Python, rather than development of Python.  (My original use case was a scripting language that could contain embedded Python code).  Thanks to Nick for his original answer.

Rob Cliffe


On 11/06/2018 23:31, Eric Fahlgren wrote:
On Mon, Jun 11, 2018 at 3:10 PM Rob Cliffe via Python-Dev <python-dev@python.org <mailto:python-dev@python.org>> wrote:

    Skip, I think you have misunderstood the  point I was making.  It was
    not whether the loop variable should leak out of a list
    comprehension.
    Rather, it was whether a local variable should, so to speak, "leak
    into"
    a list comprehension.  And the answer is: it depends on whether
    the code
    is executed normally, or via exec/eval.  Example:

    def Test():
           x = 1
           print([x+i for i in range(1,3)])              # Prints [2,3]
           exec('print([x+i for i in range(1,3)])') # Raises NameError (x)
    Test()

    I (at least at first) found the difference in behaviour surprising.


​Change 'def' to 'class' and run it again.  You'll be even more surprised.​

<http://www.avg.com/email-signature?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient> Virus-free. www.avg.com <http://www.avg.com/email-signature?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient>

<#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to