2012-04-24 17 views
5

Từ những gì tôi có thể nói, sự khác biệt giữa PyList_SetItem và PyList_SETITEM là PyList_SetItem sẽ giảm số lượng tham chiếu của mục danh sách mà nó ghi đè và PyList_SETITEM thì không.PyList_SetItem so với PyList_SETITEM

Có lý do nào khiến tôi không nên sử dụng PyList_SetItem mọi lúc không? Hoặc tôi sẽ gặp rắc rối nếu tôi sử dụng PyList_SetItem để khởi tạo một vị trí chỉ mục trong một danh sách?

Trả lời

6

PyList_SET_ITEM là một macro không an toàn về cơ bản đưa đối tượng vào mảng con trỏ bên trong của danh sách mà không có bất kỳ kiểm tra ràng buộc nào. Nếu bất kỳ điều gì không phải là NULL nằm ở vị trí thứ i của danh sách, thì sẽ xảy ra rò rỉ tham chiếu. PyList_SET_ITEM đánh dấu tham chiếu đến đối tượng bạn đưa vào danh sách. PyList_SetItem cũng đánh cắp tham chiếu, nhưng nó kiểm tra giới hạn và decrefs bất cứ điều gì mà có thể ở vị trí thứ i. Quy tắc-ngón tay cái được sử dụng PyList_SET_ITEM để khởi tạo các danh sách bạn vừa tạo và PyList_SetItem nếu không. Nó cũng hoàn toàn an toàn khi sử dụng PyList_SetItem ở mọi nơi; PyList_SET_ITEM về cơ bản là tốc độ hack.

+1

Nhưng tôi sẽ gặp phải bất kỳ sự cố nào nếu tôi sử dụng PyList_SetItem * tất cả * thời gian và * không bao giờ * sử dụng PyList_SETITEM? – user1245262

+2

Tuyệt đối không. Trong thực tế, đó có lẽ là cách an toàn nhất. 'PyList_SET_ITEM' chủ yếu là hack tốc độ. –

+0

Cảm ơn - và cảm ơn bạn đã thêm dòng cuối cùng vào câu trả lời ban đầu của bạn. – user1245262