Просто имейте в виду, что exec выполняет любую передаваемую строку, как если бы вы ввели ее в свой файл .py или интерпретатор.
При отладке кода, связанного с exec (), полезно регистрировать все, что вы собираетесь 'exec', когда столкнетесь с проблемами, если бы вы это сделали, вы легко заметили бы, что E0 не был назначен строке "zbc", но к несуществующему объекту zbc.
Кроме того, этот пример кода действительно странный. Есть несколько законных способов использования строк в переменных экземпляра или в объектах в других пространствах имен, особенно когда вы кодируете высокодинамичный класс, который должен делать разумные вещи с беспорядочным вводом, или должен настроить кучу переменных экземпляра из дикт или строка. Но без контекста код в вашем вопросе выглядит так, как будто вы избегаете или не понимаете, как использовать объекты list () и dict ().
Я бы порекомендовал рассказать немного больше о том, чего вы пытаетесь достичь, в следующий раз, когда вы зададите вопрос о чем-то особенном, как это. Это дало бы людям хорошую возможность предложить лучшее решение или - если вы подходите к конкретной проблеме совершенно разумным образом - не даст куче ответов, говорящих вам, что вы делаете что-то совершенно не так.