2016-10-21 22 views
6

Giá trị của x sau khi mã sau được thực thi là gì?Giải thích vòng lặp trống lồng nhau

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

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

Câu trả lời là c, ai đó có thể giải thích tại sao điều này xảy ra? Tôi hiểu được 2/3 lặp, nhưng không hiểu tại sao nó đã đi từ tầng 1 đến 2, như trong lý do tại sao nó không trở thành [[],[]]

+4

in x vòng lặp để biết lý do tại sao –

+3

Bạn có muốn đổi tên câu hỏi của mình để câu hỏi cụ thể hơn không? Tôi nghĩ rằng nó sẽ giúp người dùng SO đồng nghiệp đang tìm kiếm cùng một vấn đề. – perlyking

Trả lời

8
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] 

đầu ra:

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

ooooooh cảm ơn nhé, không chắc tại sao tôi lại gặp rắc rối. cảm ơn mặc dù! – user2958503

3

Hãy bước thông qua mã này, chúng ta sẽ ?:

  • x = []: Tạo một danh sách trống gọi x
  • for i in range(3): lặp lại các đoạn mã sau ba lần:
    • x = [x + x] gán giá trị của x với giá trị hiện tại của x, cộng với giá trị hiện tại của x và quấn rằng trong một danh sách.

Về cơ bản, những gì đang xảy ra mỗi lần lặp là danh sách của bạn được lồng bởi một cấp, và danh sách bên trong danh sách của bạn hiện đang trở thành danh sách phụ của danh sách lồng nhau.

Trong thuật ngữ của giáo dân, giải thích đơn giản nhất là - Trên mỗi lần lặp của vòng lặp for, giá trị của biến x được gán lại cho giá trị của hai lồng nhau, cũng có thể chứa hai danh sách lồng nhau khác, bên trong một danh sách.

Dưới đây là một minh chứng cho thấy giá trị của x trên mỗi lần lặp của for -loop:

>>> # 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 
>>> 

Nếu hình minh họa ở trên là quá đông đúc, đây là một ngắn một:

First iteration 
Value of x: [[]] 

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

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

Tôi cũng tìm thấy việc tạo cấu trúc cây giống như từ danh sách lồng nhau, giúp hiểu điều gì đang xảy ra tốt hơn:

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

Tôi đã sử dụng khoảng trống thừa cho một biểu thức rõ ràng.

Đầu tiên Run:

x + x = [] + [] = []
danh sách trống + danh sách trống là một danh sách trống

nên [x + x] = [ [] ]
chú ý![[]] không phải là một danh sách trống, đó là một danh sách có chứa một danh sách trống

Second Run:

x + x = [[]] + [[]] = [[], []]
nên [x + x] = [ [[], []] ]

Thứ ba Run:

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

do đó [x + x] = [ [[[[], []]], [[[], []]]] ]

+0

bạn đã đúng! Tôi sẽ sắp xếp lại nó. Xin lỗi vì điều đó, đây là bài viết đầu tiên của tôi ... – Pham

+2

Không có vấn đề gì. ở đây và bỏ phiếu để giúp bạn nhìn chằm chằm;) –

Các vấn đề liên quan