Add an object to a python list

后端 未结 4 1554
傲寒
傲寒 2021-01-07 17:38

I am trying to add an object to a list but since I\'m adding the actual object when I try to reset the list thereafter, all the values in the list are reset. Is there an act

相关标签:
4条回答
  • 2021-01-07 17:45

    You need to create a copy of the list before you modify its contents. A quick shortcut to duplicate a list is this:

    mylist[:]
    

    Example:

    >>> first = [1,2,3]
    >>> second = first[:]
    >>> second.append(4)
    >>> first
    [1, 2, 3]
    >>> second
    [1, 2, 3, 4]
    

    And to show the default behavior that would modify the orignal list (since a name in Python is just a reference to the underlying object):

    >>> first = [1,2,3]
    >>> second = first
    >>> second.append(4)
    >>> first
    [1, 2, 3, 4]
    >>> second
    [1, 2, 3, 4]
    

    Note that this only works for lists. If you need to duplicate the contents of a dictionary, you must use copy.deepcopy() as suggested by others.

    0 讨论(0)
  • 2021-01-07 17:53

    Is your problem similar to this:

    l = [[0]] * 4
    l[0][0] += 1
    print l # prints "[[1], [1], [1], [1]]"
    

    If so, you simply need to copy the objects when you store them:

    import copy
    l = [copy.copy(x) for x in [[0]] * 4]
    l[0][0] += 1
    print l # prints "[[1], [0], [0], [0]]"
    

    The objects in question should implement a __copy__ method to copy objects. See the documentation for copy. You may also be interested in copy.deepcopy, which is there as well.

    EDIT: Here's the problem:

    arrayList = []
    for x in allValues:
        result = model(x)
        arrayList.append(wM) # appends the wM object to the list
        wM.reset()           # clears  the wM object
    

    You need to append a copy:

    import copy
    arrayList = []
    for x in allValues:
        result = model(x)
        arrayList.append(copy.copy(wM)) # appends a copy to the list
        wM.reset()                      # clears the wM object
    

    But I'm still confused as to where wM is coming from. Won't you just be copying the same wM object over and over, except clearing it after the first time so all the rest will be empty? Or does model() modify the wM (which sounds like a terrible design flaw to me)? And why are you throwing away result?

    0 讨论(0)
  • 2021-01-07 17:53

    while you should show how your code looks like that gives the problem, i think this scenario is very common. See copy/deepcopy

    0 讨论(0)
  • 2021-01-07 17:59

    If i am correct in believing that you are adding a variable to the array but when you change that variable outside of the array, it also changes inside the array but you don't want it to then it is a really simple solution.

    When you are saving the variable to the array you should turn it into a string by simply putting str(variablename). For example:

    array.append(str(variablename))
    

    Using this method your code should look like this:

    arrayList = []
    for x in allValues:
        result = model(x)
        arrayList.append(str(wM))        #this is the only line that is changed.
        wM.reset()
    
    0 讨论(0)
提交回复
热议问题