требуется создание справочной переменной в Python (продолжение) - PullRequest
0 голосов
/ 18 декабря 2008

Это было полезным кганнакакис. Я столкнулся с проблемой, как показано ниже:

a = ['zbc','2.3']
for i in range(0,5):
    exec('E%d=%s' %(i,a[i]))

В результате:

Traceback (most recent call last):
  File "", line 2, in 
    exec('E%d=%s' %(i,a[i]))
  File "", line 1, in 
NameError: name 'zbc' is not defined

Ответы [ 4 ]

2 голосов
/ 18 декабря 2008

Похоже, код, который вы генерируете, расширяется до:

E0=zbc
E1=2.3

На следующей итерации цикла вы получите исключение IndexError, поскольку длина a составляет всего два элемента.

Итак, учитывая вышеизложенное, вы пытаетесь присвоить значение zbc значению E0. Если zbc не существует (что, по-видимому, не существует), вы получите упоминавшуюся ошибку NameEr.

Трудно определить, что вы на самом деле пытаетесь сделать с этим кодом, поэтому я не уверен, что порекомендовать. Вы можете назначить строки вместо:

exec('E%d="%s"' %(i,a[i]))

Это расширилось бы до:

E0="zbc"
E1="2.3"

Вы все равно получите IndexError, потому что ваш массив a не имеет 5 элементов в длину. Это должно быть легко исправить для вас.

0 голосов
/ 19 декабря 2008

Просто имейте в виду, что exec выполняет любую передаваемую строку, как если бы вы ввели ее в свой файл .py или интерпретатор.

При отладке кода, связанного с exec (), полезно регистрировать все, что вы собираетесь 'exec', когда столкнетесь с проблемами, если бы вы это сделали, вы легко заметили бы, что E0 не был назначен строке "zbc", но к несуществующему объекту zbc.

Кроме того, этот пример кода действительно странный. Есть несколько законных способов использования строк в переменных экземпляра или в объектах в других пространствах имен, особенно когда вы кодируете высокодинамичный класс, который должен делать разумные вещи с беспорядочным вводом, или должен настроить кучу переменных экземпляра из дикт или строка. Но без контекста код в вашем вопросе выглядит так, как будто вы избегаете или не понимаете, как использовать объекты list () и dict ().

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

0 голосов
/ 18 декабря 2008

Кажется, вы пытаетесь использовать решение, отмеченное в этом вопросе.

Если ваша цель - получить доступ к значениям в цикле, вы должны просто использовать список. Эта странная концепция имен переменных с числами в них не должна использоваться ни в одном языке. Попробуйте это.

vals = ['foo', 'bar', 'blah', 67, -0.4, 'your mom']
for i in range(len(vals)):
    print(vals[i])

Это правильный способ иметь список значений, проиндексированных целым числом, не помещая его в имя переменной.

0 голосов
/ 18 декабря 2008

Хорошо. этот код очень странный.

Как один лайнер, подобный этому, это не синтаксически правильно, но я подозреваю, что по какой-то причине вы пропускаете разрывы строк. Но тогда это становится

a = ['zbc','2.3']
for i in range(0,5): 
    exec('E%d=%s' %(i,a[i]))

Но это приведет к ошибке индексации ссылки на [i], как показано:

>>> a
['zbc', '2.3']
>>> for i in range(0,5):
...    print a[i]
... 
zbc
2.3
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IndexError: list index out of range

Если вы избежите этой проблемы, вы получите

exec("E2.3=1")

на втором проходе через lopp, и это тоже синтаксическая ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...