Python 为什么交换是一种方式,而不是另一种方式?
对于leetcode,我尝试用Python2.7解决这个问题,代码在文章的底部。但是,对于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],则交换/分配
[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]
的值,这会把事情搞砸。谢谢