Python 为什么交换是一种方式,而不是另一种方式?

Python 为什么交换是一种方式,而不是另一种方式?,python,python-2.7,Python,Python 2.7,对于leetcode,我尝试用Python2.7解决这个问题,代码在文章的底部。但是,对于[2,1]的输入,函数将永远循环。但是,如果我更改执行交换的行,并切换变量,使顺序相反,那么交换将实际工作,函数将正确执行 因此,当前代码的交换为:nums[i],nums[nums[i]-1]=nums[nums[i]-1],nums[i],这不起作用(这在while循环中)。如果我将交换顺序更改为nums[nums[I]-1],nums[I]=nums[I],nums[nums[I]-1],则交换/分配

对于leetcode,我尝试用Python2.7解决这个问题,代码在文章的底部。但是,对于
[2,1]
的输入,函数将永远循环。但是,如果我更改执行交换的行,并切换变量,使顺序相反,那么交换将实际工作,函数将正确执行

因此,当前代码的交换为:
nums[i],nums[nums[i]-1]=nums[nums[i]-1],nums[i]
,这不起作用(这在
while
循环中)。如果我将交换顺序更改为
nums[nums[I]-1],nums[I]=nums[I],nums[nums[I]-1]
,则交换/分配确实有效。为什么呢?我这样看,似乎Python的
a,b=b,a
交换是通过将
a
b
放在堆栈上(首先评估
=
的右侧),然后重新分配它们来工作的。如果这就是它的工作原理,那么为什么
b,a=a,b
不能达到同样的效果呢

在Leetcode的在线评判中,我当前的(永远循环的方式)冻结了页面。我在本地的Python2.7环境中尝试了它,它也永远循环。我测试了
a,b=b,a
在我的环境中等同于
b,a=a,b
。那么,为什么我下面的代码在交换处于一个顺序时会永远循环,而在另一个顺序中却能完美地工作呢

def firstMissingPositive(nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) == 1:
            if nums[0] != 1:
                return 1
            else:
                return 2
        i = 0
        while i < len(nums):
            if nums[i] > 0 and nums[i] - 1 < len(nums) and nums[i] != nums[nums[i]-1]:
                #Line below does not work
                nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]

                #=>> ??But this works?? # nums[nums[i]-1], nums[i]  = nums[i], nums[nums[i]-1]
            else:
                i += 1

        for i, int in enumerate(nums):
            if int != i + 1:
                return i + 1

        return len(nums) + 1
def firstMissingPositive(nums):
"""
:type nums:List[int]
:rtype:int
"""
如果len(nums)==1:
如果nums[0]!=1:
返回1
其他:
返回2
i=0
而我0且nums[i]-1>?但这有效吗nums[nums[i]-1],nums[i]=nums[i],nums[nums[i]-1]
其他:
i+=1
对于i,枚举中的int(nums):
如果int!=i+1:
返回i+1
返回长度(nums)+1

使用nums[i]-1作为nums的下标引入了一个额外的求值,而不是您想要的顺序。运行一个简单的测试,比如在列表[1,2,3,4,5,6,7]上,只使用其中的一些语句,您将看到结果

如果您只处理一个中间操作,我认为您将获得所需的语义:

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

因为您在遍历列表时正在对其进行变异。。。。这是一个很大的禁忌!!!啊,好吧-我想是因为我在赋值时更改了
nums[I]
的值,这会把事情搞砸。谢谢