2012-01-17 32 views
105
>>> x=[1,2] 
>>> x[1] 
2 
>>> x=(1,2) 
>>> x[1] 
2 

Cả hai đều hợp lệ không? Là một trong những ưu tiên cho một số lý do?Sự khác biệt giữa các danh sách được bao quanh bởi dấu ngoặc vuông và dấu ngoặc đơn trong Python là gì?

+0

Chỉ cần thông tin: có sự khác biệt sâu sắc hơn giữa '(i cho tôi trong ...)' và '[i cho tôi trong ...]'. –

+1

@RikPoggi Sự khác biệt sâu sắc là gì? Bạn có thể vui lòng xây dựng? – qazwsx

+8

Biểu tượng đầu tiên là biểu thức ** generator ** và biểu thức thứ hai là ** list comprehension **. Bạn có thể tìm thấy một số thông tin ở đây: [Hướng dẫn chính thức về Danh sách hiểu] (http://docs.python.org/py3k/tutorial/datastructures.html#list-comprehensions), [PEP 289] (http: //www.python .org/dev/peps/pep-0289 /). Và ở đây trong một số câu hỏi về hệ điều hành: [Biểu thức máy phát điện so với danh sách hiểu biết] (http://stackoverflow.com/questions/47789/generator-expressions-vs-list-comprehension), [generator-comprehension] (http: // stackoverflow .com/questions/364802/generator-comprehension). –

Trả lời

185

Dấu ngoặc vuông là lists trong khi dấu ngoặc đơn là tuples.

Một danh sách là có thể thay đổi, có nghĩa là bạn có thể thay đổi nội dung của nó:

>>> x = [1,2] 
>>> x.append(3) 
>>> x 
[1, 2, 3] 

trong khi các bộ không:

>>> x = (1,2) 
>>> x 
(1, 2) 
>>> x.append(3) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'tuple' object has no attribute 'append' 

Sự khác biệt chính khác là một tuple là hashable, có nghĩa là bạn có thể sử dụng nó như một chìa khóa cho một từ điển, trong số những thứ khác. Ví dụ:

>>> x = (1,2) 
>>> y = [1,2] 
>>> z = {} 
>>> z[x] = 3 
>>> z 
{(1, 2): 3} 
>>> z[y] = 4 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'list' 

Lưu ý rằng, như nhiều người đã chỉ ra, bạn có thể thêm các bộ với nhau. Ví dụ:

>>> x = (1,2) 
>>> x += (3,) 
>>> x 
(1, 2, 3) 

Tuy nhiên, này không có nghĩa là có thể thay đổi các bộ. Trong ví dụ trên, một bộ sưu tập mới được tạo bằng cách thêm hai bộ dữ liệu với nhau làm đối số. Tuple ban đầu không được sửa đổi. Để chứng minh điều này, hãy xem xét những điều sau đây:

>>> x = (1,2) 
>>> y = x 
>>> x += (3,) 
>>> x 
(1, 2, 3) 
>>> y 
(1, 2) 

Trong khi đó, nếu bạn đã xây dựng ví dụ này cùng với một danh sách, y cũng sẽ được cập nhật:

>>> x = [1, 2] 
>>> y = x 
>>> x += [3] 
>>> x 
[1, 2, 3] 
>>> y 
[1, 2, 3] 
+1

Thật vậy, chúng ta có thể gắn thêm thứ vào một bộ tuple như '(1,2) + (3,) # (1,2,3)' hoặc '(1,2) + (3,4) # (1,2, 3,4) 'nhưng chúng ta không thể sửa đổi mọi thứ. –

+2

@AlexisPaques - đó không thực sự là phụ thêm, vì các bộ gốc không được sửa đổi. Bạn đang tạo một * new * tuple như là kết quả của việc cộng lại hai bộ dữ liệu hiện có. – jterrace

+0

Thật vậy, bạn đã đúng. Sai lầm của tôi –

2

Đầu tiên là một danh sách, thứ hai là một tuple. Danh sách có thể thay đổi, bộ dữ liệu thì không.

Hãy xem phần Data Structures của hướng dẫn và phần Sequence Types của tài liệu.

4

Chúng không phải là danh sách, chúng là danh sách và bộ tuple. Bạn có thể đọc về tuples trong hướng dẫn Python. Trong khi bạn có thể thay đổi danh sách, điều này là không thể với tuples.

In [1]: x = (1, 2) 

In [2]: x[0] = 3 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 

/home/user/<ipython console> in <module>() 

TypeError: 'tuple' object does not support item assignment 
3

mục bằng dấu phẩy tách ra được bao bọc bởi ()tuple s, được bao bọc bởi những []list s.

+1

Không có danh sách nào được bao quanh bởi dấu ngoặc tròn "tròn", chúng là các bộ dữ liệu! Nhưng bạn có thể có nghĩa là điều đúng. ': P' – Gandaro

+1

_Lists kèm theo (và) là tuples_ .. Tôi đang bối rối, họ là danh sách hoặc bộ dữ liệu? – juliomalegria

+0

@ julio.alegria Tôi nghĩ những gì @FlopCoder có nghĩa là viết là "** Các mục ** kèm theo' ('và') 'là' tuple', những cái được kèm theo bởi '[' và ']' là 'list' . " – funroll

0

Dấu ngoặc đơn và dấu ngoặc đơn khác nhau là các dấu ngoặc vuông có thể mô tả việc hiểu danh sách, ví dụ: [x for x in y]

Trong khi cú pháp ở giữa dấu ngoặc tương ứng quy định cụ thể một tuple phát: (x for x in y)

Bạn có thể có được một sự hiểu biết tuple sử dụng: tuple(x for x in y)

Xem: Why is there no tuple comprehension in Python?

0

Một sự khác biệt thú vị đó là cần lưu ý là khi chỉ có một giá trị duy nhất là ở đó.

lst=[1] 
print lst   // prints [1] 
print type(lst) // prints <type 'list'> 

notATuple=(1) 
print notATuple  // prints 1 
print type(notATuple) // prints <type 'int'> 
             ^^ 

Dấu phẩy phải được bao gồm trong một bộ ngay cả khi nó chỉ chứa một giá trị duy nhất. ví dụ. (1,) thay vì (1).

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