Python - одна переменная равняется другой переменной, когда она не была должна

Я не думаю, что такой простой способ существует, потому что CollectionDeserializer создает экземпляр коллекции перед анализом. Так что для этого вам нужно создать свой десериализатор.

Но я не уверен =))

6
задан darudude 5 November 2008 в 07:54
поделиться

6 ответов

Да, я думаю, что ответы здесь показывают Вашу проблему. Только попытаться разъясниться немного.

Вы ссылаетесь на список, поэтому когда список изменится, любая ссылка на тот список отразит то изменение. Продемонстрировать:

>>> 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]
30
ответ дан 8 December 2019 в 02:24
поделиться

Что такое x_past и x_present? Я не знаю много Python, но с точки зрения.NET/Java, если они будут ссылками на некоторую структуру данных (карта или безотносительно) затем создание их ссылки на тот же объект (как Вы делаете в запуске), будет означать, что любые изменения, внесенные через одну переменную, будут видимы через другой. Это кажется, что необходимо сделать копию структуры данных вместо просто делания уроки. Структура данных Вы работаете с, имеют какой-либо вид доступной функциональности "клона"?

Как я говорю, хотя, я не знаю много Python, таким образом, это могло быть полностью неправильно...

4
ответ дан 8 December 2019 в 02:24
поделиться

В Python все - объект. Так оператор x_past = x_present указывают на ту же ссылку.

1
ответ дан 8 December 2019 в 02:24
поделиться

Поскольку другие указали, что ответ должен заменить: 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)))
3
ответ дан 8 December 2019 в 02:24
поделиться

Выглядит, как будто x_present является списком. Я подозреваю, что это означает, что присвоение x_last = x_present превращает x_last в псевдоним, т.е. они ссылаются на ту же переменную. Это могло бы иметь место?

0
ответ дан 8 December 2019 в 02:24
поделиться

попытайтесь измениться 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]

0
ответ дан 8 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: