2015-08-08 2 views
1

ниже код возвращает ошибку:Выполнение операции по карте в классе списка переменных

class my_class: 

def __init__(self): 
    self.l = [(1,2),(3,4)] 

def funct(self): 
    self.l = list(map(lambda x: x[0], l)) 
    print (l) 

ob = my_class() 
ob.funct() 

TypeError: 'int' object is not subscriptable

Однако, если бы отделить логику от класса - это работает, как ожидалось

l = [(1,2),(3,4)] 
l = list(map(lambda x: x[0], l)) 
print (l) 

[1, 3]

Может ли кто-нибудь объяснить, почему выполнение тех же операций над переменной класса вызывает вышеупомянутую ошибку?

P.S. Я с помощью Python 3.4, хотя не считаю, что это имеет значение

+0

Это мой вопрос, и я испортил фактический код, и этот вопрос не помогает сообществу. Удалите его. Спасибо – Dennis

ответ

2

код работает, если вы на самом деле использовать атрибут self.l:

def funct(self): 
     self.l = list(map(lambda x: x[0], self.l)) 
     print(self.l) 

Выход:

[1, 3] 

Где-то у вас есть один int либо в l, который вы определили где-то, либо в self.l, если я не был определен, вы бы получили локальную переменную `UnboundLocalError: 'l', указанную перед назначением.

Основываясь на ваш комментарий, что это опечатка, то вы имеете в self.l в int не только кортежи:

class my_class: 
    def __init__(self): 
     self.l = [3,(1,2),(3,4)] 

    def funct(self): 
     l = list(map(lambda x: x[0],self.l)) 
     print(self.l) 

Затем запустить пример:

In [2]: ob = my_class() 

In [3]: ob.funct() 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-3-e9ee341f0f31> in <module>() 
----> 1 ob.funct() 

<ipython-input-1-e1a6b2682f9f> in funct(self) 
     4 
     5  def funct(self): 
----> 6   l = list(map(lambda x: x[0],self.l)) 
     7   print(self.l) 

<ipython-input-1-e1a6b2682f9f> in <lambda>(x) 
     4 
     5  def funct(self): 
----> 6   l = list(map(lambda x: x[0],self.l)) 
     7   print(self.l) 

TypeError: 'int' object is not subscriptable 

`

+0

Извините за опечатку. Да, вы правы - это может работать с этим изменением, это означает, что с моим основным кодом что-то не так. Не могли бы вы удалить свой ответ, чтобы я мог удалить свой вопрос? – Dennis

+0

@ Dennis, если это опечатка, что не так, у вас есть 'int' где-то в' self.l', а не только кортежи –

+0

Держитесь, я постараюсь опубликовать реальный код за секунду. – Dennis

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