[Tutor] longest common substring

Dave Angel d at davea.name
Sat Nov 12 15:57:10 CET 2011


On 11/12/2011 09:48 AM, lina wrote:
> On Sat, Nov 12, 2011 at 9:22 PM, Dave Angel<d at davea.name>  wrote:
>> On 11/12/2011 03:54 AM, lina wrote:
>>>
>>> <SNIP>
>>> The one I tried :
>>>                  if longest>= 2:
>>>                      sublist=L1[x_longest-longest:x_longest]
>>>                      result=result.append(sublist)
>>>                      if sublist not in sublists:
>>>                           sublists.append(sublist)
>>>
>>> the $ python3 CommonSublists.py
>>> atom-pair_1.txt atom-pair_2.txt
>>> Traceback (most recent call last):
>>>    File "CommonSublists.py", line 47, in<module>
>>>      print(CommonSublist(a,b))
>>>    File "CommonSublists.py", line 24, in CommonSublist
>>>      result=result.append(sublist)
>>> AttributeError: 'NoneType' object has no attribute 'append'
>>>
>>> in local domain I set the result=[]
>>> I don't know why it complains its NoneType, since the "result" is
>>> nearly the same as "sublists".
>>>
>> Assuming this snippet is part of a loop, I see the problem:
>>
>> result  = result.append(sublist)
>>
>> list.append() returns none.  It modifies the list object in place, but it
>> doesn't return anything.  So that statement modifies the result object,
>> appending the sublist to it, then it sets it to None.  The second time
>> around you see that error.
>
> I am sorry.  haha ... still lack of understanding above sentence.
>
>>>> a
> ['3', '5', '7', '8', '9']
>>>> d.append(a)
>>>> d
> [['3', '5', '7', '8', '9']]
>>>> type(a)
> <class 'list'>
>
> Sorry and thanks, best regards,
>
> lina
>
>>
>> In general, most methods in the standard library either modify the object
>> they're working on, OR they return something.   The append method is in the
>> first category.
>>
>>

To keep it simple, I'm using three separate variables.  d and a are as 
you tried to show above.  Now what happens when I append?

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
 >>> d = []
 >>> a = [3, 5, 7]
 >>> xxx = d.append(a)
 >>> print(repr(xxx))
None
 >>> print d
[[3, 5, 7]]

Notice that d does change as we expected.  But xxx, the return value, is 
None. The append() method doesn't return any useful value, so don't 
assign it to anything.

The statement in your code that's wrong is
     result = result.append(sublist)

The final value that goes into result is None, no matter what the 
earlier values of result and sublist were.

-- 

DaveA


More information about the Tutor mailing list