2015-07-10 4 views
0

Я пишу фрагмент кода, который принимает ввод, который изменяется в соответствии с дискретными шагами времени. Для каждого временного шага я получаю новое значение для ввода. Как сохранить каждое значение в виде списка?Хранение каждого значения изменяющейся переменной

Вот пример:

"""when t = 0, d = a 
    when t = 1, d = b 
    when t = 2, d = c""" 

n = [] 
n.append(d)  #d is the changing variable 
for i in range(t): 
    n.append(d) 

Что я ожидаю получить это: for t = 0, n = [a]; for t = 1, n = [a,b]; and for t = 2, n = [a,b,c]

То, что я на самом деле получаю: for t = 0, n = [a], for t = 1, n = [b,b]; и for t = 2, n = [c,c,c]

+0

там нет необходимости в цикле здесь, как вы получите вход – The6thSense

+0

Он производится с помощью другого сценария. – cmlcrz

+0

Итак, вы получаете более точный ввод от другого сценария, и вы должны добавить символ в список, так как вы увеличили его, можете ли вы указать, как вы получили вход от другого скрипта. – The6thSense

ответ

1

Вы можете просто сделать это

n = [] 
for i in range(t + 1): 
    n.append(chr(i+ord('a')) 

И если вы не хотите, чтобы хранить символы в списке, скорее, некоторые конкретные значения, которые связаны с d, то вы должны изменить d в цикл

n = [] 
d = 1 
for i in range(t + 1): 
    n.append(d) 
    d += 2 
+0

Благодарим вас за ответ. Я сам не объяснил себя. Я отредактировал мой вопрос, чтобы сделать его более ясным. – cmlcrz

+0

Я отредактировал свой ответ для вашего нового редактирования! –

+0

Еще раз спасибо, но вопрос заключается не в том, как получить эти конкретные значения для d, а о том, как их хранить, поскольку они предварительно определены (вычисляются другим фрагментом сценария) – cmlcrz

2

См комментарий ниже, но на основе дополнительная информация вы предоставили, заменить это:

n.append(d) 

с этим:

n.append(d[:]) 
+0

Спасибо, но вопрос в том, а не о том, как получить эти конкретные значения для d, но о том, как их хранить, поскольку они предварительно определены (я отредактировал мой вопрос, чтобы сделать его более понятным). – cmlcrz

+0

Можете ли вы показать остальную часть кода, который используете? Является ли блок кода, который вы разместили в функции/классе? Если вы запустите код, который я разместил с теми же параметрами, которые вы отправили, он вернет правильный список результатов, который вы ожидаете. – cggarvey

+0

Кусок не является частью функции или класса. Он написан внутри Grasshopper (плагин для Rhinoceros). Я не могу опубликовать остальную часть кода, потому что он фрагментирован. Что я могу добавить, так это то, что для каждого временного шага (t) значение d является (другим) списком ints – cmlcrz

0

трудно сказать, Wi не видя код. Но если d не является int, это может произойти. Если d список, например, он передается по ссылке

n = [] 
d = [1] 
n.append(d) 

d[0] = 2 
n.append(d) 
print(n) 
>>>> [[2], [2]] 

Так что, если каждый новый d просто модифицирована, возникают ваши Probleme. Вы можете решить эту проблему путем копирования d:

from copy import copy 
n = [] 
d = [1] 
n.append(copy(d)) 

d[0] = 2 
n.append(copy(d)) 
print(n) 
>>>> [[1], [2]] 
+0

Спасибо. Как вы говорите, тот факт, что d изменяется для каждого временного шага, создает мою проблему. Поэтому, даже если я копирую d, он будет копировать новое значение каждый раз, а предыдущие значения d не сохраняются. – cmlcrz

+0

@cmlcrz Если вы скопируете его перед его заменой, он не будет перезаписан. См. Мой пример: у вас есть все значения. – Patrick

2

Какой тип является переменной 'd'? Если это, например, список, код, который вы показываете, толкает на tbe list 'n' ссылку на переменную 'd', а не на ее копию. Таким образом, для каждой итерации цикла вы добавляете новую ссылку «d» (например, указатель в C) на «n», а когда «d» обновляется, все записи в «n» имеют, конечно, одно и то же значение чтобы исправить это можно изменить код так, чтобы добавить копию 'D', либо:

  • n.append (d [:])
  • n.append (список (d))
  • n.append (кортеж (d))
+0

Спасибо. d - это список. Однако я думаю, что проблема не связана с типом данных переменной, а с тем, что при изменении значения d предыдущие значения не сохраняются. – cmlcrz

0

Если вы просто обернуть переменную внутри объекта, вы можете наблюдать, что в настоящее время устанавливается на переменную с помощью переопределения __setattr__ метод. Простой пример.

class DummyClass(object): 
    def __init__(self, x): 
     self.history_of_x=[] 
     self.x = x 
     self._locked = True 
    def __setattr__(self, name, value): 
     self.__dict__[name] = value 
     if name == "x": 
      self.history_of_x.append(value) 

d = DummyClass(4) 
d.x=0 
d.x=2 
d.x=3 
d.x=45 
print d.history_of_x 

Выход: -

[4, 0, 2, 3, 45] 
+0

Спасибо, @ k4vin, но это не сработало для меня. Значение входной переменной, которую я использую как параметр для класса, изменяется до того, как оно входит в класс, поэтому результат остается тем же: список, заполненный одним и тем же элементом t количество раз (t - временные шаги). – cmlcrz

Смежные вопросы