交换数组中的元素导致问题

swap elements in an array causing issue

提问人:Qiang Super 提问时间:1/6/2021 最后编辑:Qiang Super 更新时间:1/6/2021 访问量:104

问:

新年快乐。我有一个关于在 Python 环境下交换数组中元素的问题。没有问题的代码是:

def findMissingNumber(nums):
    length = len(nums)
    result = []
    i = 0
    while i < length:
        # num = nums[i]
        target = nums[i] - 1
        if nums[i] != i+1 and nums[i] != nums[target]:
            # swap with the nums[i]-1
            nums[target], nums[i]= nums[i], nums[target]
        else:
            i += 1
    for j in range(length):
        if nums[j] != j+1:
            result.append(j+1)
    return result

print(findMissingNumber([2, 3, 1, 8, 2, 3, 5, 1]))
print(findMissingNumber([2, 4, 1, 2]))
print(findMissingNumber([2, 3, 2, 1]))

回答:

[4, 6, 7]
[3]
[4]

错误的是:

def findMissingNumber(nums):
    length = len(nums)
    result = []
    i = 0
    while i < length:
        num = nums[i]
        target = num - 1
        if num != i+1 and num != nums[target]:
            # swap with the num-1
            nums[target], num = num, nums[target]
        else:
            i += 1
    for j in range(length):
        if nums[j] != j+1:
            result.append(j+1)
    return result

print(findMissingNumber([2, 3, 1, 8, 2, 3, 5, 1]))
print(findMissingNumber([2, 4, 1, 2]))
print(findMissingNumber([2, 3, 2, 1]))

回答:

[4, 6, 7]
[3, 4]
[3, 4]

我不确定为什么引用(我应该这样称呼)会引起麻烦。你介意详细解释一下吗?
谢谢。

python 复制和交换

评论

0赞 Chris 1/6/2021
这两个代码段是相同的
0赞 Qiang Super 1/6/2021
谢谢,@Chris。然后我已经更新了代码。

答:

1赞 gsb22 1/6/2021 #1

修复了带有注释的代码。

def findMissingNumber(nums):
    length = len(nums)
    result = []
    i = 0
    while i < length:
        # num and nums[i] have the same value but doesnt refer to same memory location
        num = nums[i]
        target = num - 1
        if num != i+1 and num != nums[target]:
            # swap with the num-1
            
            # incorrect swap, num value is not referencing the list index, but has a copy of its value,
            # so instead of swapping value with num, do it from the list like below
            # nums[target], num = num, nums[target]
            
            
            # correct swap
            nums[target], nums[i] = nums[i], nums[target]
        else:
            i += 1
    for j in range(length):
        if nums[j] != j+1:
            result.append(j+1)
    return result

print(findMissingNumber([2, 3, 1, 8, 2, 3, 5, 1]))
print(findMissingNumber([2, 4, 1, 2]))
print(findMissingNumber([2, 3, 2, 1]))

评论

0赞 Qiang Super 1/6/2021
谢谢。你介意多谈谈 num 和 nums[i] 之间的区别吗?我仍然不太明白。
0赞 gsb22 1/6/2021
@QiangSuper 当你 时,你正在做的是获取值,然后创建一个新变量并为其赋值。现在 num 和 nums[i] 是单独的引用。因此,无论您对 num 做什么,都不会反映在列表中,这就是交换没有反映在列表中的原因。num = nums[i]nums[i]nums[i]nums
0赞 Qiang Super 1/7/2021
谢谢你的解释。这是否意味着 Python 中的 a = b 是将值从 b 复制到 a,但不会在它们之间创建链接关系?
0赞 gsb22 1/7/2021
@QiangSuper,不,实际上是 a = b,两者都指向同一位置,因为您引用的是整个变量。因此,在上述情况下,如果您已经创建了 ,那么所做的任何更改也会反映出来numbers = numsnumbersnums
0赞 Qiang Super 1/8/2021
感谢您的帮助。我试着总结一下你分享的结果。如果为新变量赋值,例如 a = b[0]。a 是内存中的新位置,因此对 a 的任何更改都不会影响 b[0]。但是,如果为整个变量分配一个新的引用,比如 a = b,则 a 仍然指向内存中 b 的位置,b 的任何变化都会影响 b。请问为什么?欣赏。