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) *  |
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. |
|
|