无法理解Python中swapping语句的这种行为

iugsix8n  于 6个月前  发布在  Python
关注(0)|答案(1)|浏览(73)

我在leetcode上解决一个问题。“41.第一个缺失的阳性”
为了交换,当我用

nums[i],nums[nums[i]-1] = nums[nums[i]-1],nums[i]

字符串
TLE(Time Limit Exceeded)

nums[nums[i]-1],nums[i] = nums[i],nums[nums[i]-1]


非常完美
这不仅仅是leetcode的情况。
我试着去理解两者的区别,花了1个小时解决这个问题。然后联系了谷歌的巴德和Chatgpt。两者都很挣扎。
在花了很多时间之后,我得到了一个答案:“鉴于这两个代码共享相同的逻辑和条件语句,为什么代码1会出现问题仍然令人费解,特别是在你描述的无限循环的情况下。
下面是我的代码:

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        i,n = 0,len(nums)

        while i<n:
            if nums[i]>0 and nums[i]<=n and nums[nums[i]-1]!=nums[i]:
                #nums[i],nums[nums[i]-1] = nums[nums[i]-1],nums[i]
                nums[nums[i]-1],nums[i] = nums[i],nums[nums[i]-1]

            else:
                i+=1
        for i in range(n):
            if nums[i]!=i+1:
                return i+1
        return n+1


注解掉的语句给出了TLE,但第二个语句工作正常。有人能解释一下,是什么导致了这一点?a,b=b,ab,a=a,b不同吗?
我还在Python IDLE中定义了这个函数,在swapping语句下面添加了一个print语句,它再次陷入了无限循环。
Defined function in Python IDLE
Output (infinite loop)
TLE with first statement
Accepted with second statement

ia2d9nvy

ia2d9nvy1#

是的,分配发生的 * 顺序 * 发生变化。
在第一种情况下,

nums[i],nums[nums[i]-1] = nums[nums[i]-1],nums[i]

字符串

  • 首先 *,nums[i]被更新,然后nums[num[i] -1]被更新,所以 * 第二个赋值目标受第一个更改的影响 *。

所以它相当于这样的东西:

temp = nums[nums[i]-1],nums[i] 
nums[i] = temp[0]
nums[nums[i]-1] = temp[1]


在第二种情况下,

temp = nums[i], nums[nums[i]-1]
nums[nums[i]-1] = temp[0]
nums[i] = temp[1]

  • 首先 * nums[nums[i]-1]被更新,然后nums[i]被更新。nums[nums[i]-1]中的nums[i]将与第一种情况不同。

所以,如果你看一下赋值语句的文档,他们给予了一个简单的例子:
虽然赋值的定义意味着左侧和右侧之间的重叠是“同时”的(例如a, b = b, a交换两个变量),但是赋值变量集合中的重叠是从左到右发生的,有时会导致混淆。例如,下面的程序打印[0, 2]

x = [0, 1]
i = 0
i, x[i] = 1, 2         # i is updated, then x[i] is updated
print(x)

相关问题