2017-06-17 2 views
1

Je codais quelque chose, et il y avait une erreur dans une partie. Mais je ne peux pas trouver pourquoi l'erreur se produit.NameError: le nom 'self' n'est pas défini IN EXEC/EVAL

code (échantillon, similaire à la partie d'erreur):

class Test: 
def __init__(self,a=0): 
    self.x = a 
    self.l = [2**x for x in range(a)] #<--- self.l = [1,2,4,8,16] 
    self.base() 

def base(self): 
    expr = "self.l{0} = [self.l[x]+{0} for x in range(self.x)]" #<--- when i=4, self.l4 = [5,6,8,12,20] 
    for i in range(self.x): 
     exec(expr.format(i)) 

w = Test(5) 
print(w.l4) 

Je pense que je reçois ceci:

[5, 6, 8, 12, 20] 

MAIS,

File "D:/Documents and Settings/Desktop/py/py/test2.py", line 12, in <module> 
    w = Test(5) 
File "D:/Documents and Settings/Desktop/py/py/test2.py", line 5, in __init__ 
    self.base() 
File "D:/Documents and Settings/Desktop/py/py/test2.py", line 10, in base 
    exec(expr.format(i)) 
File "<string>", line 1, in <module> 
File "<string>", line 1, in <listcomp> 

NameError: name 'self' is not defined 

(Désolé pour le mauvais Français)

Répondre

-1

Pas besoin pour eval ou exec ici.

for i in range(self.x): 
    setattr(self, "l{}".format(i), [self.l[x]+i for x in range(self.x)]) 

Bien que je ne sais pas pourquoi vous voulez faire cela; mieux vaut le conserver sous forme de liste plutôt que de définir des attributs dynamiquement.