了解可变变量在不同范围内的行为方式

时间:2017-12-04 22:04:26

标签: python python-3.x list scope mutable

这里有新手到Python。在Codingbat上练习使用列表时,我意识到有些行为我对列表以及可变变量的行为方式不了解。以下示例源于一些Codingbat问题,以构建我的问题...

  1. 在getManipulatedNewList()中,newnums被销毁,因为它超出范围(这是正确的吗?),这就是为什么bobo第一次得到None。

  2. 我现在假设唯一的方法是确保我获得列表的实际副本是在外部创建一个函数 - 所以深度复制必须在操作a的函数之外发生列表,在使用新列表的同一范围内。正确的吗?

  3. 然后在下面的最后一个函数中传递了什么(whatIsThisDoing() - 我显然用参数“nums”的第一个和最后一个元素创建一个新列表,然后我立即返回.Bobo得到成功分配列表(否则arr [0] = 999也会改变bobo中的第一个值)。

  4. 为什么这样可行,但是getManipulatedNewList()会破坏newnums?

    有没有办法按照返回匿名列表的方式传递newnums,所以不会被破坏?

    (或者我在这里误解了,请:)

    import copy
    
    def getManipulatedNewList(nums):
        # Create new list
        newnums = copy.deepcopy(nums)
    
        # For example only; assume many, more complex list manipulations
        # occur here
        newnums = newnums.reverse()
    
        # Return the newly-created list reference (doesn't work.)
        return newnums
    
    
    def manipulateList(nums):
        # For example only; assume many, more complex list modifs
        # occur here
        nums = nums.reverse()
    
        # Nothing to return
    
    
    def whatIsThisDoing(nums):
        # This actually returns something!
        # Why, though? It's creating the new list in this function too.
        return [nums[0], nums[-1]]
    
    if __name__ == '__main__':
        arr = [1,2,3]
        print(arr)
        print("---")
    
        bobo = getManipulatedNewList(arr)
        print(arr)  # Shouldn't be touched, as expected
        print(bobo) # newnums was destroyed so bobo is None
        print("---")
    
        # Is this the only good solution to working with mutable vars?
        bobo = copy.deepcopy(arr)
        manipulateList(bobo)
        print(bobo)
    
        # Why does this work?
        bobo = whatIsThisDoing(arr)
        print(bobo)
        print("---")
    
        arr[0] = 999
        print(bobo) # bobo[0] isn't changed, so it's not referencing arr[0]
    

1 个答案:

答案 0 :(得分:3)

没有。你得到无的原因是因为那是从reverse返回的;该方法适用于此。这个问题与范围无关,而其余的误解源于此。