Home > Software engineering >  why is a, b = b, a not working as the way it should be when a, b are subarrays with different length
why is a, b = b, a not working as the way it should be when a, b are subarrays with different length

Time:01-14

As a newbie to Python, I understand a, b = b, a in python as a simple swap, but why does it not behave as I expected when a and b are two subarrays with different lengths?

For example:

nums = [1, 2, 3, 4, 5, 6, 7]

nums[0:4], nums[4:] = nums[4:], nums[0:4]

print(nums)  #[5, 6, 7, 5, 1, 2, 3, 4]

Why there's a duplicated 5 after 7? Why is it not [5, 6, 7, 1, 2, 3, 4] since I just divided nums into 2 subarrays and swapped their order?

Thanks!

CodePudding user response:

Thinking of a, b = b, a as a swap breaks down when you're working with more complicated expressions than just variables.

When evaluating nums[0:4], nums[4:] = nums[4:], nums[0:4], Python starts with the RHS, which evaluates to ([5, 6, 7], [1, 2, 3, 4]).

Then it assigns [5, 6, 7] to nums[0:4]. This replaces the first 4 elements of nums with the elements of the [5, 6, 7] list, producing

[5, 6, 7, 5, 6, 7]

Then it assigns [1, 2, 3, 4] to nums[4:]. nums[4:] is not the last 3 elements, because the first assignment changed the size of the list. nums[4:] is now only the last two elements. Python replaces the last two elements of nums with [1, 2, 3, 4], producing

[5, 6, 7, 5, 1, 2, 3, 4]

CodePudding user response:

Do it the other way around and it works:

nums[4:], nums[0:4] = nums[0:4], nums[4:]

# nums is [5, 6, 7, 1, 2, 3, 4]
  • Related