Используйте словарь для обработки переменных - PullRequest
0 голосов
/ 16 декабря 2011

Я хочу знать, возможно ли обрабатывать переменные через словарь.

Пример:

global MyVar
...
MyVar = 0xFFFF
d={"MyVar":MyVar}
def ChangeVar (var_to_change, value)
 d[var_to_change] = value #I know this code assigns a new value to the key...
...
ChangeVar("MyVar",25)
...

Я хочу использовать словарь, чтобы "выбрать", какую переменную я буду изменять.Я всегда могу использовать массив, но я хочу знать, возможно ли это сделать.Я не очень много знаю об указателях в Python.

В C было бы что-то вроде этого (возможно, я написал дополнительный или пропустил '*'):

int MyCVar = 0;
int MyCVar2 = 0;
int *MyD[] = {&MyCVar,&MyCVar2};
...
*(MyD[index]) = some_value;

Я надеюсь, что выпонять, что я пытаюсь объяснить.

Спасибо,

Джонатан

РЕДАКТИРОВАТЬ: Спасибо всем за ваши ответы.То, что я пытался сделать, было довольно сложно, так как python обрабатывает имена и объекты совершенно по-разному.То, что я сделал, было примерно так:

class mytype(object):
   def __init__(self,name=""):
      self.__Name = name
      ....
      myDict[name] = self

, тогда я могу получить доступ ко всем объектам, используя Name переменной.Это поведение, которое я пытался объяснить в первом примере.И вот как я получу доступ к этим объектам.

myDict["MyVar"].Value = 1

Спасибо всем, ваши ответы дали несколько хороших идей.

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

Да, я думаю, что @JBernardo имеет правильную идею.

Поработав некоторое время на вашем коде, чтобы попытаться выяснить, что именно вы пытаетесь сделать:создать словарь всех имен переменных и использовать этот словарь в качестве справочной таблицы для изменения значений?

http://docs.python.org/library/functions.html#globals

 globals()["MyVar"] = 25

Переназначит глобальный MyVar в целочисленное значение25

1 голос
/ 16 декабря 2011

В python все локальные (и глобальные) переменные уже помещены в словарь, поэтому вы можете получить доступ к этим словарям.

Вы можете сделать это с помощью встроенных в locals () и globals ()funcions.

Т.е.:

locals()['x'] = 'whatever'

Однако не рекомендуется:

Содержимое этого словаря не должно изменяться;изменения могут не влиять на значения локальных переменных, используемых интерпретатором.

из doc

Простой случай, когда он терпит неудачу:

def test():
    a = 'a'
    locals()['a'] = 'b'
    print a
test()

globals (), otoh безопасен для изменения.

0 голосов
/ 16 декабря 2011

В Python нет сахара для получения семантики двойного указателя.Вам нужно передать ссылку некоторому объекту, который может изменить значение, которое вы хотите.Например, в вашем словаре может храниться функция, которая имеет доступ к MyVar и может изменить его.

MyVar = 5
def ChangeMyVar(value):
    global MyVar
    MyVar = value
d['MyVar'] = ChangeMyVar

# later..
d['MyVar'](10)

Вам будет лучше спроектировать это так, чтобы он передавал объект, который оборачивает фактическое значение, которое вас волнует.

class WrappedVar(object):
    def __init__(self, val):
        self.value = val

MyVar = WrappedVar(5)
d['MyVar'] = MyVar

# later..
d['MyVar'].value = 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...