kampella
Можно и не передавать, список всеравно именится.
Вот твой первый код, убрал передачу в вызове:
>>> def one():
... l = [1]
... print 'one', l
... def two(l):
... l[0] += 1
... print 'two', l
... two()
... print 'one+1', l
...
>>> one()
one [1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in one
TypeError: two() takes exactly 1 argument (0 given)
>>>
Ничего не меняется, потому что даже не срабатывает ;)
А вот то, что ты имел в виду (но не смог записать):
>>> def one():
... l = [1]
... print 'one', l
... def two():
... l[0] += 1
... print 'two', l
... two()
... print 'one+1', l
...
>>> one()
one [1]
two [2]
one+1 [2]
>>>
И что тут неправильного? Обращение происходит к l, l в функции нет - она начинает искать её в окрестностях и находит на уровне выше.