Я не думаю, что такой простой способ существует, потому что CollectionDeserializer
создает экземпляр коллекции перед анализом. Так что для этого вам нужно создать свой десериализатор.
Но я не уверен =))
Да, я думаю, что ответы здесь показывают Вашу проблему. Только попытаться разъясниться немного.
Вы ссылаетесь на список, поэтому когда список изменится, любая ссылка на тот список отразит то изменение. Продемонстрировать:
>>> x_present = [4,5,6]
>>>
>>> x_past = x_present
>>>
>>> x_past
[4, 5, 6]
>>>
>>> x_present.append(7)
>>>
>>> x_past
[4, 5, 6, 7]
>>>
Если Вы хотите копию списка, необходимо сделать, делают это, listcopy = mylist [:].
>>> x_past = x_present[:]
>>> x_past
[4, 5, 6, 7]
>>>
>>> x_present.append(8)
>>>
>>> x_past
[4, 5, 6, 7]
Что такое x_past и x_present? Я не знаю много Python, но с точки зрения.NET/Java, если они будут ссылками на некоторую структуру данных (карта или безотносительно) затем создание их ссылки на тот же объект (как Вы делаете в запуске), будет означать, что любые изменения, внесенные через одну переменную, будут видимы через другой. Это кажется, что необходимо сделать копию структуры данных вместо просто делания уроки. Структура данных Вы работаете с, имеют какой-либо вид доступной функциональности "клона"?
Как я говорю, хотя, я не знаю много Python, таким образом, это могло быть полностью неправильно...
В Python все - объект. Так оператор x_past = x_present указывают на ту же ссылку.
Поскольку другие указали, что ответ должен заменить: x_past = x_present
x_past = x_present[:]
. В целом Вы могли использовать a copy
модуль для копирования объекта в Python.
>>> import copy
>>> a = range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> b = a
>>> a += 10, 11
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> c = copy.copy(a) # shallow copy
>>> c
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> del a[3:]
>>> a
[0, 1, 2]
>>> b
[0, 1, 2]
>>> c
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
Ваш код является unpythonic по меньшей мере.
Это могло быть заменено чем-то как следующий код:
import copy
# assert(len(x_present) >= len(eqn))
first = True
while True:
x_past = copy.copy(x_present) # copy
for j, eqj in enumerate(eqn):
x_present[j] = sum(x_present[k] * eqj[k]
for k in range(j if first else len(eqj))
if k != j)
x_present[j] += eqj[j]
print "X_PAST\n%s\nX_PRESENT\n%s" % (x_past, x_present)
if allequal(x_past, x_present, tolerance=10**-2):
break
first = False
Вот определение allequal()
(использование абсолютной погрешности. Это могло бы или не могло бы быть хорошей идеей в Вашем случае (Вы могли использовать относительную погрешность вместо этого)):
def allequal(x, y, tolerance):
return (len(x) == len(y) and
all(-tolerance < (xx - yy) < tolerance
for xx, yy in zip(x, y)))
Выглядит, как будто x_present является списком. Я подозреваю, что это означает, что присвоение x_last = x_present превращает x_last в псевдоним, т.е. они ссылаются на ту же переменную. Это могло бы иметь место?
попытайтесь измениться x_past = x_present
строка к x_past = [x for x in x_present]
и посмотрите, помогает ли это.
стенография копии списка является моей любимой функцией Python, так как я могу сделать остроты, которые не возможны на других языках:
greaterthan100 = [x for x in number if x > 100]
notinblacklist = [x for x in mylist if x not in blacklist]
firstchildofbigfamily = [x.child[0] for x in familylist if len(x.child) > 10]