Peculiar swap behavior
Lie Ryan
lie.1296 at gmail.com
Thu Mar 5 07:06:27 CET 2009
andrew cooke wrote:
> Delaney, Timothy (Tim) wrote:
>> Tim Chase wrote:
>>> # swap list contents...not so much...
>>> >>> m,n = [1,2,3],[4,5,6]
>>> >>> m[:],n[:] = n,m
>>> >>> m,n
>>> ([4, 5, 6], [4, 5, 6])
> [...]
>> For these types of things, it's best to expand the code out. The
>> appropriate expansion of:
>> m,n = [1,2,3],[4,5,6]
>> m[:],n[:] = n,m
>> is:
>> m = [1,2,3]
>> n = [4,5,6]
>> m[:] = n
>> n[:] = m
>> [...] OTOH, for:
>> m,n = [1,2,3],[4,5,6]
>> m[:],n[:] = n[:],m[:]
>> the expansion is more like:
>> m = [1,2,3]
>> n = [4,5,6]
>> rhs1 = n[:]
>> rhs2 = m[:]
>> m[:] = rhs1
>> n[:] = rhs2
>
> Maybe I'm just being stupid, but you don't seem to have explained
> anything. Isn't the question: Why is the expansion different for the two
> cases? Why don't both expand to have the intermediate rhs variables?
>
> Andrew
>
>
Actually the expansion is the same for all case:
Pseudo notation:
m = `m obj`
n = `l obj`
rhs1 = `n rhs`
rhs2 = `m rhs`
`m lhs` = rhs1
`n lhs` = rhs2
where `m rhs` and `n rhs` is whatever you put on the right hand side of
the assingment; and `m lhs` and `n lhs` is whatever you put on the left
hand side of the assignment.
i.e.:
m, n = [1, 2, 3], [4, 5, 6]
m[:], n[:] = n, m
is
m = [1, 2, 3]
n = [4, 5, 6]
rhs1 = n
rhs2 = m
m[:] = rhs1
n[:] = rhs2
while:
m, n = [1, 2, 3], [4, 5, 6]
m[:], n[:] = n[:], m[:]
is
m = [1, 2, 3]
n = [4, 5, 6]
rhs1 = n[:]
rhs2 = m[:]
m[:] = rhs1
n[:] = rhs2
while:
m, n = [1, 2, 3], [4, 5, 6]
m, n = n, m
is
m = [1, 2, 3]
n = [4, 5, 6]
rhs1 = n
rhs2 = m
m = rhs1
n = rhs2
while:
m, n = [1, 2, 3], [4, 5, 6]
m, n = n[:], m[:]
is
m = [1, 2, 3]
n = [4, 5, 6]
rhs1 = n[:]
rhs2 = m[:]
m = rhs1
n = rhs2
More information about the Python-list
mailing list