This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Execution sequence for print function
Type: behavior Stage: resolved
Components: Versions:
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: remi.lapeyre, xtreak
Priority: normal Keywords:

Created on 2019-03-07 10:24 by iitkgp.ketan@gmail.com, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Messages (4)
msg337381 - (view) Author: Ketan Sharma (iitkgp.ketan@gmail.com) Date: 2019-03-07 10:24
>>> def pola(arr):
...   for i, item in enumerate(arr):
...     arr[i] = item*item
...
>>> a = [1,2,3,4]
>>> print(a,pola(a),a)
[1, 4, 9, 16] None [1, 4, 9, 16]

I would expect the print statement to execute and print the arguments sequentially from left to right. This could be an optimization trick inside the Python compiler, but still different that what would be expected. Thanks.
msg337382 - (view) Author: Rémi Lapeyre (remi.lapeyre) * Date: 2019-03-07 10:28
print does not execute statements, arguments are first resolved like with any function. Your code is equivalent to:

>>> def pola(arr):
...     for i, item in enumerate(arr):
...             arr[i] = item*item
... 
>>> a = [1,2,3,4]
>>> pola(a)
>>> print(a, None, a)
[1, 4, 9, 16] None [1, 4, 9, 16]

I would close this as not a bug.
msg337384 - (view) Author: Karthikeyan Singaravelan (xtreak) * (Python committer) Date: 2019-03-07 10:45
Agreed with @remi.lapeyre. There is no delayed evaluation in Python and this is not only related to print but it's the general evaluation model in Python. Another example as below since foo(1) is used as an argument it's evaluated first and then the return value is passed.

def bar(a, b):
    print("bar ", a, b)
    return (a, b)

def foo(b):
    print("foo ", b)
    return b

bar(foo(1), 2) # foo is first evaluated to pass 1 bar


$ python3 /tmp/foo.py
foo  1
bar  1 2

Closing this as not a bug.
msg337649 - (view) Author: Ketan Sharma (iitkgp.ketan@gmail.com) Date: 2019-03-11 06:53
Realized this is expected behavior. Slight modification to the existing comments:
Resolution happens in usual order for print(a, pola(a), a).

1) a -> is a reference to the array, resolved as is.
2) pola(a) -> changes the values pointed at by the reference a
3) a -> resolved as the new array values.
History
Date User Action Args
2022-04-11 14:59:12adminsetgithub: 80404
2020-09-16 00:15:23ketan.sharmasetnosy: - iitkgp.ketan@gmail.com
2019-03-11 06:53:16iitkgp.ketan@gmail.comsetmessages: + msg337649
2019-03-07 10:45:10xtreaksetstatus: open -> closed

nosy: + xtreak
messages: + msg337384

resolution: not a bug
stage: resolved
2019-03-07 10:28:13remi.lapeyresetnosy: + remi.lapeyre
messages: + msg337382
2019-03-07 10:24:25iitkgp.ketan@gmail.comcreate