Python Forum

Full Version: ternary operator with unpacking
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hello,
After using ternary operators extensively I am getting lost in this case. It took me a couple of hours to understand why I was getting bugged, and though I've identified the cause I can't understand why this example works like this.

# pretty clear
a = [("1", "2"), ("", "")]
b, c = list(zip(*a))
print(b)
print(c)
('1', '')
('2', '')
# here I would expect the same as before, however...
a = [("1", "2"), ("", "")]
b, c = list(zip(*a)) if True else [""], [""]
print(b)
print(c)
[('1', ''), ('2', '')]
['']
# this result is expected but why it differs from the second?
a = [("1", "2"), ("", "")]
b, c = list(zip(*a)) if True else ([""], [""])
print(b)
print(c)
('1', '')
('2', '')
Would someone be willing to comment on this? Smile

EDIT: after posting the thread and staring at it, a spark came... ternary operator ended with the comma... so [""] was passed to c even when condition evaluates to True
Note that the result of this expression list(zip(*a)) if True else [""] will always be [the result of] first part - list(zip(*a)) because your condition is explicit True, i.e. you are not evaluating the truthfulness of the first part. More over with given value of a the first part will be considered True in any case.

In the second example, on the right hand side you have implicit tuple with first element being list(zip(*a)) if True else [""] and the second element is [""]. During the unpacking they are assigned to b and c respectively.

In the third example the right hand side ultimately ends being list(zip(*a)) - i.e. the first part of the ternary operator as explained at the top of this post. And it's unpacked accordingly into b and c.
Yes, the CONDITION being True is just for example. I didn't mean to say I explicitly write True there.
Yes, then I realised that in the ternary expression giving "," ends it and unpacks differently.
I will correct my examples to avoid confusion.
(Jan-07-2019, 12:26 PM)joaomcteixeira Wrote: [ -> ]Yes, the CONDITION being True is just for example. I didn't mean to say I explicitly write True there.
Sorry, I misunderstood that part
Just for fun:

Guido van Rossum in Python-Dev list

Quote:Pleas stop calling it 'ternary expression'. That doesn't explain
what it means. It's as if we were to refer to the + operator as
'binary expression'

According to PEP308 Python has conditional expression :-)
Jeje,
Thanks for sharing the info and the links Cool , let's go for conditional expression.
Best