Sử dụng +=
với một danh sách giống như gọi extend
, không +
.
- Bạn có thể gọi
extend
có thể lặp lại.
- Bạn chỉ có thể sử dụng
+
với một danh sách khác.
Tôi chỉ có thể đoán tại sao quyết định này được đưa ra, nhưng tôi cho rằng đó là vì lý do hiệu suất. Gọi +
kết quả trong một đối tượng mới được tạo và tất cả các mục được sao chép, trong khi extend
có thể sử dụng dung lượng trống trong đối tượng danh sách hiện có để lưu bản sao trong một số trường hợp.
Một tác dụng phụ khác của quyết định này là nếu bạn viết x += y
các tham chiếu khác vào danh sách sẽ thấy thay đổi nhưng nếu bạn sử dụng x = x + y
thì chúng sẽ không. Đây được thể hiện dưới đây:
>>> x = ['a','b']
>>> y = ['c', d']
>>> z = x
>>> x += y
>>> z
['a', 'b', 'c', 'd']
>>> x = ['a','b']
>>> y = ['c', d']
>>> z = x
>>> x = x + y
>>> z
['a', 'b']
Tài liệu tham khảo
Python source code for list.
Mã nguồn cho +=
:
static PyObject *
list_inplace_concat(PyListObject *self, PyObject *other)
{
PyObject *result;
result = listextend(self, other);
if (result == NULL)
return result;
Py_DECREF(result);
Py_INCREF(self);
return (PyObject *)self;
}
Mã nguồn cho +
:
static PyObject *
list_concat(PyListObject *a, PyObject *bb)
{
Py_ssize_t size;
Py_ssize_t i;
PyObject **src, **dest;
PyListObject *np;
if (!PyList_Check(bb)) {
PyErr_Format(PyExc_TypeError,
"can only concatenate list (not \"%.200s\") to list",
bb->ob_type->tp_name);
return NULL;
}
// etc ...
Nguồn
2010-07-09 21:36:37
Tôi "đồng ý" với câu hỏi của bạn; nó là một đối số tốt chống lại quá tải toán tử cho tôi. – u0b34a0f6ae
Đã xóa câu trả lời của tôi sau khi bạn chỉnh sửa - có vẻ như bạn đang băn khoăn về lý do đằng sau không hỗ trợ + giữa danh sách và một lần lặp - lỗi của tôi. Ngoài việc nói, "Ừ, tại sao không?", Tôi không có câu trả lời. –
đó là lỗi * lớn *. nói chung, bất kỳ ngôn ngữ hoặc thư viện nào xác định các hành vi khác nhau cho các nhà khai thác tương tự sẽ được coi là người dùng thù địch. không ai sane sẽ sử dụng '+' cho chuỗi nối: hoạt động đó không giao hoán! –