I was looking at this guy's post: https://stackoverflow.com/a/2573965/1959054
He was talking about testing people's Python proficiency by asking them the outputs of the following code:
x = 42
y = x
x = x+1
print x
print y
x = [1,2,3]
y = x
x[0]=4
print x
print y
I predicted those two outputs successfully, having just read about similar scenarios with mutable lists and immutable strings in a book. Then he gave this example:
x = ["foo",[1,2,3],10.4]
y = list(x)
y[0] = 'foooooo'
y[1][0] = 4
print x
print y
This left me very confused. You see, I predicted that x
would print as ["foo",[1,2,3],10.4]
and y
would print as ["foooooo",[4,2,3],10.4]
.
x
actually printed as ["foo",[4,2,3],10.4]
, meaning that, even though the outside list was referencing different list
objects, the inner list at x[1]
and y[1]
was still referencing the same object.
I hadn't come across this before.
My primary question is, if you want to make y
equivalent to x
, but not reference the same list, and ALSO make sure any nested lists aren't referencing the same lists as well, how do you do that? y = list(x)
seems to only handle the outer list.
My secondary question is just to get any help conceptually understanding why this works this way.