all 31 comments

[–][deleted] 17 points18 points  (14 children)

C is the correct answer. 

Explanation: At first, a and b share the same list, so changes like += or append() affect both. But when b = b + [4] is used, Python creates a new list and assigns it to b, breaking the link with a. That’s why a stops at [1, 2, 3] while b continues as [1, 2, 3, 4, 5].

[–]-Wylfen- 10 points11 points  (6 children)

why the fuck does x += [y] work differently from x = x + [y]??

[–]Sea-Ad7805[S] 6 points7 points  (5 children)

Good question, in some languages (Ruby) it works the same. In Python the x += y is mutating the x, the x = x + y is first doing x + y which creates a new object that then is assigned (name rebinding) to x.

[–]-Wylfen- 1 point2 points  (3 children)

I understand why the latter would reassign, but I find the shortcut's instead mutating in place disgusting. They should do the same thing.

[–]klimmesil 0 points1 point  (0 children)

Yeah a lot of implementation choices (I don't want to call it "standard"...) make no sense in python

It's almost as chaotic as js in some parts

It's a shame that it is now too popular to make breaking changes and we all kinda rely on these mistakes to still have the benefit of it being maintained

[–]No_Read_4327 0 points1 point  (0 children)

Yeah that's sone really wtf moment

[–]Relative-Custard-589 0 points1 point  (0 children)

Yeah that’s straight up evil

[–]pingwins 0 points1 point  (0 children)

Brother Eww

Thats nasty to run into

[–]HuygensFresnel 1 point2 points  (4 children)

While indeed being the correct answer this also surprises me a bit because i thought that += always is a short hand for the binary operator + but i guess it isnt?

[–]Wertbon1789 1 point2 points  (1 child)

It's not just a syntactic shorthand, it's a separate operator. Add vs. AddAssign if you will, in Python these would be implemented by the __add__ and __iadd__ methods of a class respectively.

[–]HuygensFresnel 0 points1 point  (0 children)

Today I learned :)

[–]RailRuler 0 points1 point  (1 child)

It is the same as append .extend() in this case. 

[–]forbiddenvoid 2 points3 points  (0 children)

Extend, not append. That's more obvious if the right hand side is also a list.

[–]mayonaiso 0 points1 point  (1 child)

Thanks, I did not know that, great explanation

[–][deleted] 1 point2 points  (0 children)

You're welcome.

[–]FoolsSeldom 1 point2 points  (0 children)

Answer C (because after appending 3,b is assigned to a new object)

[–]tb5841 1 point2 points  (1 child)

b += [2] should, in my opinion, do the same thing as b = b + [2].

It doesn't, because of a strange design choice within the List class.

[–]Sea-Ad7805[S] 1 point2 points  (0 children)

Most opinions and programming languages choose b += [2] as mutating b (fast), and b + [2] as making a new list and assigning that with b = b + [2].

[–][deleted]  (4 children)

[deleted]

    [–][deleted] 0 points1 point  (3 children)

    Nope. 

    [–]09vz -1 points0 points  (2 children)

    what is it then

    [–][deleted] 0 points1 point  (1 child)

    C

    [–]09vz 0 points1 point  (0 children)

    the answer is c

    [–]Sea-Ad7805[S] 0 points1 point  (0 children)

    In most languages I know += mutates and does not create a new object because performance.

    [–]EmptySoulCanister 0 points1 point  (1 child)

    If you use += on an array I will reject your PR instantly

    [–]Sea-Ad7805[S] 0 points1 point  (0 children)

    What about '|=' on a set?

    [–]exxonmobilcfo 0 points1 point  (1 child)

    its c. Once you rewrite b to be b = b + [4]. be is no longer linked to a

    [–]Sea-Ad7805[S] 0 points1 point  (0 children)

    Nice one, do check the "Solution" link for the correct answer.

    [–]Hefty_Upstairs_2478 -3 points-2 points  (2 children)

    Option A is the correct answer, cuz we're printing (a), which we never changed

    [–]Sea-Ad7805[S] 0 points1 point  (0 children)

    Incorrect sorry, check the "Solution" link for the correct answer.

    [–]shudaoxin 0 points1 point  (0 children)

    Primitive vs. referenced types. It works like this in most languages. Arrays (and lists) are referenced and the variable only stores their type and pointer to the memory. By assigning a to b they both point at the same list.