Điều này về cơ bản là một câu hỏi về tuổi thọ của thời gian. Nếu một hàm trả về một đối tượng, nhưng tham chiếu không được gán cho một biến và chỉ được sử dụng để gọi một phương thức trên đối tượng được trả về, thì tham chiếu tạm thời có bị xóa tự động không?Các tham chiếu tạm thời có được tự động xóa trong Python không?
Để cung cấp cho một ví dụ cụ thể, giả sử có chuỗi này các cuộc gọi phương pháp:
o.method_a().method_b()
là tài liệu tham khảo tạm thời được trả về bởi o.method_a()
tự động xóa khi cuộc gọi đến method_b()
kết thúc, như thể dòng được viết như sau:
tmp = o.method_a()
try:
tmp.method_b()
finally:
tmp = None
EDIT: Tôi quan tâm đến câu trả lời chung. CPython hoàn thành các đối tượng ngay sau khi số lượng tham chiếu giảm xuống 0. Các triển khai Python khác có thể không hoàn thành các đối tượng ngay lập tức. Tôi tự hỏi nếu ngôn ngữ Python là như C + +, đảm bảo rằng các đối tượng tạm thời bị phá hủy ở cuối của tuyên bố mà họ đã được tạo ra. (Ngoại trừ rằng trong Python, câu hỏi là liệu tham khảo tạm thời bị xóa vào cuối của bản tuyên bố mà họ đã tạo ra.)
Trong C++, mã tương tự có thể được thực hiện với:
class B {
public:
void method_b();
};
class A {
public:
std::shared_ptr<B> method_a();
};
A o;
o.method_a()->method_b();
C++ trạng thái chuẩn "Các đối tượng tạm thời bị hủy bỏ như là bước cuối cùng trong việc đánh giá biểu thức đầy đủ ... mà (từ từ) chứa điểm mà chúng được tạo ra. Điều này đúng ngay cả khi việc đánh giá đó kết thúc bằng việc ném một ngoại lệ." Trong ví dụ này, có nghĩa là đối tượng std::shared_ptr<B>
tạm thời được tạo bởi lệnh gọi đến A::method_a()
sẽ bị hủy ngay lập tức khi kết thúc đánh giá biểu thức đầy đủ o.method_a()->method_b();
. Phá hủy một std::shared_ptr
có nghĩa là xóa một tham chiếu đến đối tượng được chia sẻ.
hai đoạn của bạn có ngữ nghĩa giống hệt nhau, nhưng nó không phải là một cho rằng bất kỳ trong số đó sẽ gọi finalizers hoặc phá hủy các đối tượng ngay lập tức. Trong thực tế ngay cả trong CPython sự hủy diệt có thể bị trì hoãn nếu đối tượng là trong một chu kỳ (mặc dù bạn không thể có một finalizer sau đó). – fijal