Объяснение пустого цикла во вложенных скобках

#python

#python

Вопрос:

Каково значение x после выполнения следующего кода?

 x = []
for i in range(3):
    x = [x   x]

A.[[[[]]]].
B.[[[],[]]].
C.[[[[],[]],[[],[]]]].
D.[[],[],[],[],[],[]]
  

Ответ — c, кто-нибудь может объяснить, почему это происходит? Я понимаю 2/3 итерации, но не понимаю, как она перешла с 1-й на 2-ю, например, почему она не стала [[],[]]

Комментарии:

1. выведите x в цикле, чтобы узнать, почему

2. Не могли бы вы переименовать свой вопрос, чтобы он был немного более конкретным? Я думаю, это поможет другим пользователям SO, которые ищут ту же проблему.

Ответ №1:

Я использовал дополнительные пробелы для четкого выражения.

Первый запуск :

x x = [] [] = []
пустой список пустой список — это еще один пустой список

итак [x x] = [ [] ]
внимание! [[]] это не пустой список, это список, содержащий пустой список

Второй запуск:

x x = [[]] [[]] = [[], []]
итак [x x] = [ [[], []] ]

Третий запуск :

x x = [[[], []]] [[[], []]] = [[[[], []]], [[[], []]]]

итак [x x] = [ [[[[], []]], [[[], []]]] ]

Комментарии:

1. вы правы! Я переставлю его. Извините за это, это мой первый пост…

Ответ №2:

 x = []
for i in range(3):
    print('ni =', i)
    print('x =' , x)
    print('x   x =', x   x)
    print('[x   x] =', [x   x])
    x = [x   x]
  

вывод:

 i = 0
x = []
x   x = []  # Here is why. If you extend [] by [], you get []. 
[x   x] = [[]]  # And we wrap the result.

i = 1
x = [[]]
x   x = [[], []]
[x   x] = [[[], []]]

i = 2
x = [[[], []]]
x   x = [[[], []], [[], []]]
[x   x] = [[[[], []], [[], []]]]
  

Комментарии:

1. оооооо, хорошо, спасибо, не уверен, почему у меня возникли проблемы. хотя спасибо!

Ответ №3:

Давайте пройдемся по коду, не так ли?:

  • x = [] : Создайте пустой список с именем x
  • for i in range(3) : повторите приведенный ниже код три раза:
    • x = [x x] переназначьте значение x на текущее значение x плюс текущее значение x и перенесите это в список.

По сути, на каждой итерации происходит то, что ваш список вложен на один уровень, и список внутри вашего списка в настоящее время становится вложенным списком этого вложенного списка.

С точки зрения непрофессионала, самым простым объяснением было бы — На каждой итерации цикла for значение переменной x переназначается на значение two nested, которое также может содержать два других вложенных списка внутри одного списка.

Вот иллюстрация, показывающая значение x на каждой итерации for -цикла:

 >>> # x is empty
>>> x = []
>>> 
>>> # 1st iteration
>>> x = [x   x]
>>> # x
>>> x
[[]] # your list is nested by one level
>>> 
>>> # 2nd iteration
>>> x = [x   x]
>>> # x
>>> x
[[[], []]] # your list is nested by three levels
>>> # 3rd iteration
>>> x = [x   x]
>>> # x
>>> x
[[[[], []], [[], []]]] # your list is nested by four levels
>>> 
  

Если приведенная выше иллюстрация слишком переполнена, вот более короткая:

 First iteration
Value of x: [[]] 

Second iteration
Value of x: [[[], []]] 

Third iteration
Value of x: [[[[], []], [[], []]]] 
  

Я также считаю, что создание древовидной структуры из вложенного списка помогает лучше понять, что происходит:

 [ # 1st level
    [ # second level
        [ # third level
            [], # fourth level
            [] 
        ], 
        [
            [], 
            [] # fourth level
        ] # third level
    ] # second level
] # 1st level