Do Python for loops work by reference?

前端 未结 2 626
梦如初夏
梦如初夏 2020-11-27 06:58

When using a for loop in Python to iterate over items in a list, will changing item (below) change the corresponding item in items?

相关标签:
2条回答
  • 2020-11-27 07:30

    No, variables in Python are not pointers.

    They refer to objects on a heap instead, and assigning to a variable doesn't change the referenced object, but the variable. Variables and objects are like labels tied to balloons; assignment reties the label to a different balloon instead.

    See this previous answer of mine to explore that idea of balloons and labels a bit more.

    That said, some object types implement specific in-place addition behaviour. If the object is mutable (the balloon itself can change), then an in-place add could be interpreted as a mutation instead of an assignment.

    So, for integers, item += 1 is really the same as item = item + 1 because integers are immutable. You have to create a new integer object and tie the item label to that new object.

    Lists on the other hand, are mutable and lst += [other, items] is implemented as a lst.__iadd__([other, items]) and that changes the lst balloon itself. An assignment still takes place, but it is a reassigment of the same object, as the .__iadd__() method simply returns self instead of a new object. We end up re-tying the label to the same balloon.

    The loop simply gives you a reference to the next item in the list on each iteration. It does not let you change the original list itself (that's just another set of balloon labels); instead it gives you a new label to each of the items contained.

    0 讨论(0)
  • 2020-11-27 07:32

    Well, it really depends on the items.

    Take the following case:

    class test():
        pass
    
    a = test()
    a.value = 1
    
    b = test()
    b.value = 2
    
    l = [a,b]
    
    for item in l:
        item.value += 1
    
    for item in l:
        print item.value
    
    >>> 
    2
    3
    

    and in this case:

    l2 = [1,2,3]
    
    for item in l2:
        item += 1
    
    for item in l2:
        print item
    
    >>> 
    1
    2
    3
    

    So as you can see, you need to understand the pointers as Martijn said.

    0 讨论(0)
提交回复
热议问题