2013-12-14 17 views
5

tôi thấy một số câu hỏi hỏi về TypeError: 'tuple' object does not support item assignment trên SO, nhưng vẫn còn, tôi đang bối rối về điều này:python tuple, ai đó có thể giải thích hành vi này?

Hãy xem xét đoạn mã:

>>> a = ([],[]) 
>>> a[0].append(1)  # 1 
>>> a 
([1], []) 
>>> a[0] += [2] 

Traceback (most recent call last): 
    File "<pyshell#5>", line 1, in <module> 
    a[0] += [2] 
TypeError: 'tuple' object does not support item assignment # 2 
>>> a 
([1, 2], []) # 3 
>>> 

Câu hỏi của tôi là:

  1. tuples là không thay đổi, nhưng 1 đã thay đổi thành công giá trị của nó.Tại sao? (Tôi biết tôi không thực sự hiểu được tính bất biến của python ..)
  2. Nếu 1 là accepte d, lý do gì khiến số 2 tăng TypeError?
  3. Trong 3, a được sửa đổi, sau đó tăng điểm là gì TypeError?

Cảm ơn bạn

+0

Lần đầu tiên, hãy xem http://docs.python.org/3/reference/datamodel.html#objects-values-and-types - về cơ bản, "bộ dữ liệu không thay đổi" chỉ có nghĩa là "bạn không thể thêm, xóa hoặc thay thế các đối tượng trong một tuple ", không phải" các đối tượng chứa trong một tuple cũng không thay đổi được ". – delnan

Trả lời

0

Đó là bởi vì các bộ là không thay đổi, nhưng nó có thể chứa các loại dữ liệu có thể thay đổi (một danh sách trong trường hợp ur) như một phần tử.

Bộ dữ liệu a = ([], []) là một bộ danh sách. Vì vậy, đó là lý do tại sao bạn có thể nối dữ liệu vào một [0] - đó là một danh sách.

Trong này:

a[0] += 2 

Bạn đã cố gắng để thay đổi giá trị của tuple điều này làm tăng TypeError ngoại lệ (do việc sử dụng các toán tử gán '=')

Trong ba, danh sách đã được ghép nối do sử dụng toán tử '+'.

+0

-1 Câu trả lời của bạn không giải quyết cách 'a [0] + = 2' cố gắng sửa đổi bộ tuple, bởi vì ngây thơ, tôi hy vọng rằng sẽ chỉ sửa đổi đối tượng danh sách. 'a [0]' khác với 'a'. –

+0

a [0] = a [0] + [2], ở đây phía bên tay phải hoàn thành mà không có lỗi (ghép nối xảy ra), và khi cố gắng gán kết quả cho [0] bạn thực sự ấn định giá trị cho tuple , do đó, nó ném một lỗi. Tôi có thể sai. Nhưng đây là những gì tôi hiểu. – Praveen

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