How do I operate on the actual object, not a copy, in a python for loop?

前端 未结 3 529
孤独总比滥情好
孤独总比滥情好 2021-01-04 13:13

let\'s say I have a list

a = [1,2,3]

I\'d like to increment every item of that list in place. I want to do something as syntactically easy

相关标签:
3条回答
  • 2021-01-04 13:40

    Here ya go:

    # Your for loop should be rewritten as follows:
    for index in xrange(len(a)):
        a[index] += 1
    

    Incidentally, item IS a reference to the item in a, but of course you can't assign a new value to an integer. For any mutable type, your code would work just fine:

    >>> a = [[1], [2], [3], [4]]
    >>> for item in a: item += [1]
    >>> a
    [[1,1], [2,1], [3,1], [4,1]]
    
    0 讨论(0)
  • 2021-01-04 13:46

    In python integers (and floats, and strings, and tuples) are immutable so you have the actual object (and not a copy), you just can't change it.

    What's happening is that in the line: item += 1 you are creating a new integer (with a value of item + 1) and binding the name item to it.

    What you want to do, is change the integer that a[index] points to which is why the line a[index] += 1 works. You're still creating a new integer, but then you're updating the list to point to it.

    As a side note:

    for index,item  in enumerate(a):
        a[index] = item + 1
    

    ... is slightly more idiomatic than the answer posted by Triptych.

    0 讨论(0)
  • 2021-01-04 13:46

    Instead of your map-based solution, here's a list-comprehension-based solution

    a = [item + 1 for item in a]
    
    0 讨论(0)
提交回复
热议问题