2013-03-10 3 views
1

Я только что видел выход, как показано ниже - просто хочу знать, что здесь происходит.индекс списка питов тот же самый список

>>> l = [1,2,3,4] 
>>> l[0]=l 
>>> l 
[[...], 2, 3, 4] 

Почему значение l [0] отображается следующим образом? Может ли кто-нибудь объяснить мне, почему это поведение. Я думал, что он вернется, как, [[1,2,3,4], 2, 3, 4].

Приветствия, Калай

+0

Это что-то с фактическим адресом, присвоенным и повернутым на какой-то проводной выход? Потому что, когда я попробовал нижний, он работает нормально. >>> l = [1,2,3,4] >>> l [1] = l [:] >>> l [1, [1, 2, 3, 4], 3, 4] – AKK

+0

@ Kalai: Объясняется ли мой ответ? 'l [:]' делает копию списка, в противном случае он по-прежнему является указателем на оригинал. –

ответ

5

Это показывает ..., потому что в противном случае она должна была бы бесконечно рекурсивной.

Объект списка в Python является указателем на список, назначая его, как l[0] = l не делает копию. Например, попробуйте

l1 = [1, 2, 3, 4] 
l2 = [1, 2] 
l2[0] = l1 
print l2 
# [[1, 2, 3, 4], 2] 
l2[0].append(5) 
print l1 
# [1, 2, 3, 4, 5] 

Обратите внимание, что даже если вы никогда не изменял l1 в явном виде, теперь приложенный к.

Поэтому, когда вы размещаете список в себе, этот элемент списка still является ссылкой на весь список. После того, как код выше, попробуйте сделать:

l[1] # ==> 2 
l[0][1] # ==> 2 
l[0][0][1] # ==> 2 
3

Используйте копию списка, чтобы избежать бесконечной рекурсии:

In [10]: l = [1,2,3,4] 

In [11]: l[0] = l[:] 

In [12]: l 
Out[12]: [[1, 2, 3, 4], 2, 3, 4] 
0

Если бы вы использовали PrettyPrinter, выход будет был сам объяснительное

>>> l = [1,2,3,4] 
>>> l[0]=l 
>>> l 
[[...], 2, 3, 4] 
>>> pp = pprint.PrettyPrinter(indent = 4) 
>>> pp.pprint(l) 
[<Recursion on list with id=70327632>, 2, 3, 4] 
>>> id(l) 
70327632 
Смежные вопросы