2013-09-03 43 views
7

Tôi muốn khởi tạo một danh sách trong python. Tôi không hiểu tại sao đoạn code dưới đây không làm việc:khởi tạo các thành viên của một danh sách

u = ['abc', 'de', 'fghi', 'jklm', 'n', ''] 
for item in u: 
item = len(item) 

Có nhiều cách khác để khởi tạo danh sách, như:

u = [len(item) for item in u] 

Nhưng, câu hỏi của tôi là tại sao đoạn code đầu tiên không hoạt động.

Chỉnh sửa: Tôi là người mới sử dụng Python và lập trình. Rất tiếc, tôi không hiểu một số phần của câu trả lời của bạn. Ví dụ:
- rebinding trong "rebinding tên item với độ dài của tên item"
- iterator trong "mục" là một biến tạm thời trỏ đến một phần tử của một u dựa vào nơi (implicit) iterator trỏ
theo như tôi hiểu, ví dụ thứ hai của tôi, tạo ra một new_list trong bộ nhớ, và gán các giá trị của new_list-u. Không có vấn đề gì các giá trị trước đó. Nhưng tôi muốn biết làm thế nào tôi có thể thay đổi các giá trị, trong danh sách đầu tiên. Cảm ơn

Trả lời

4

Trong trường hợp đầu tiên, bạn không khởi tạo bất kỳ thứ gì. "item" là một biến tạm thời trỏ đến một phần tử của u dựa trên nơi mà trình lặp (ngầm) đang trỏ. Nếu bạn muốn khởi tạo một danh sách theo phong cách đầu tiên, bạn có thể làm như vậy như:

u = ['abc', 'de', 'fghi', 'jklm', 'n', ''] 
v = [] 
for item in u: 
    v.append(len(item)) 
print v 
3

Bạn đang khôi phục tên item với chiều dài của tên item chỉ bị ràng buộc bởi vòng lặp. Bạn không thể khởi tạo list theo cách này. Tất cả những gì bạn đang làm là rebinding một biến trong mỗi lần lặp. Việc hiểu danh sách của bạn là phương pháp hoàn toàn có thể chấp nhận để khởi tạo một số list.

+0

mục là một chuỗi trong trường hợp đầu tiên, vì các phần tử của danh sách là chuỗi. Người ta có thể gọi len() trên dây. –

+1

Đúng, tôi đã sửa câu trả lời của mình. –

0

Mã đầu tiên không làm việc. Danh sách u được khởi tạo trong dòng đầu tiên và hai dòng tiếp theo thực thi không ảnh hưởng đến phần còn lại của mã - không có điểm nào đối với chúng.

u = ['abc', 'de', 'fghi', 'jklm', 'n', ''] 

Được khởi tạo danh sách u với nội dung ['abc', 'de', 'fghi', 'jklm', 'n', ''] - đó là tất cả bạn cần làm để khởi tạo một danh sách.

Các dòng

for item in u: 
    item = len(item) 

Chỉ cần gắn tên item cho tất cả các giá trị trong u ngay sau khi rebind item đến tài sản dài của giá trị một-by-một cho đến khi người phiên dịch đã làm việc thông qua toàn bộ danh sách.

+1

Câu trả lời này có thể được cải thiện bằng cách cho OP biết cách thực sự khởi tạo danh sách. – kojiro

1

Bạn không thể thay đổi nội dung của danh sách chỉ bằng cách gán giá trị mới cho tên đại diện cho một mục nhập trong danh sách đó. Bạn cần sử dụng gán chỉ mục, ví dụ để thay đổi mục nhập đầu tiên trong danh sách thành 'foo' bạn có thể làm u[0] = 'foo'.

Trong trường hợp này bạn có thể làm một cái gì đó như sau (mặc dù danh sách hiểu từ bạn thắc mắc là sạch):

for i, item in enumerate(u): 
    u[i] = len(item) 

Lưu ý rằng nếu các mục trong danh sách của bạn là có thể thay đổi, bạn có thể sửa đổi phần tử trực tiếp, bạn không thể chỉ định lại chúng. Ví dụ với một danh sách liệt kê:

u = [['a'], ['b', 'c']] 
for item in u: 
    item.append(len(item)) 
# u is now [['a', 1], ['b', 'c', 2]] 
1

Lý do mã đầu tiên không làm việc là vì item chỉ là một tài liệu tham khảo cho từng đối tượng iterable trong chuỗi u. Khi bạn nói item = len(item), bạn thực sự chỉ định len(item) cho item, nhưng kể từ item chỉ hoạt động như một con trỏ tham chiếu trỏ đến u[i] cho bước i * trong vòng lặp của bạn, nó sẽ không thực sự thay đổi u[i].

Để thay đổi u[i] bạn có thể làm danh sách hiểu biết như bạn thấy trong câu hỏi của bạn, hoặc làm điều gì đó như:

for i in range(len(u)): 
    u[i] = len(u[i]) 

Một cách thứ ba là rất hữu ích enumerate phương pháp giới thiệu trong python 2.3.

for i, item in enumerate(u): 
    u[i] = len(item) 

Enumerate trả về một danh sách các hàng được tạo ra từ đối số của nó (không báo cho tôi về vấn đề này ... nhưng về cơ bản nó hành vi như một danh sách các hàng), nơi mỗi tuple bên trong có dạng (index , đối số [index]).

+0

Bạn nên có 'u [i] = len (item)' trong ví dụ 'enumerate'. –

+0

Đã thay đổi. Cảm ơn. – Shashank

0

item chỉ là tên. trong for loop:

for item in u: 

các item là một tài liệu tham khảo đến đối tượng mà u [i] đề cập. Nói cách khác, itemu[i] đề cập đến cùng một đối tượng.

nhưng tuyên bố này:

item = len(item) 

thay đổi tên item để tham khảo đến một int, mà giá trị được len (item).

Vì vậy, không có gì thay đổi trong danh sách u.

Danh sách hiểu:

u = [len(item) for item in u] 

chỉ là tạo một danh sách mới, và các tên u bây giờ là một tham chiếu đến các danh sách mới.

Nếu bạn muốn sử dụng cho vòng lặp, bạn có thể sử dụng enumerate tuyên bố:

for i, item in enumerate(u): 
    u[i] = len(item) 

Đó thay đổi referrings các mặt hàng của u từng người một.

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