2012-07-27 22 views
7

trong c/C++, bạn có các biến trong ngăn xếp khi bạn tạo một biến cục bộ bên trong một hàm.python tạo mọi thứ từ heap?

http://effbot.org/zone/call-by-object.htm

đối tượng CLU tồn tại độc lập với kích hoạt thủ tục. Không gian cho các đối tượng được phân bổ từ một khu vực lưu trữ năng động/.../ Trong lý thuyết, tất cả các đối tượng tiếp tục tồn tại mãi mãi. Trong thực tế, không gian được sử dụng bởi một đối tượng có thể được khai hoang khi đối tượng isno truy cập được lâu hơn vào bất kỳ chương trình CLU nào.

Điều này có nghĩa là các đối tượng trong python được tạo từ heap (như trong malloc trong c/C++)? và các đối tượng được deallocated khi không có tên liên kết với họ? (như con trỏ thông minh)?

Ví dụ:

def foo(a): 
    result = [] 
    result.append(a) 
    return result 

foo("hello") 

myList = foo("bye") 

Vì vậy, kết quả đầu tiên ([]) đã được tạo ra trong đống và đã deallocated vì không có tên gắn liền với nó?

+0

bạn cũng có thể xóa mọi thứ theo cách thủ công bằng cách sử dụng 'del' như trong' del result' nếu bạn nghĩ rằng bạn cần. –

+0

Nếu động lực của bạn để hỏi điều này là bạn muốn hàm của bạn luôn sử dụng cùng một danh sách, lưu ý rằng bạn có thể định nghĩa nó là 'def foo (a, result = [])' và cùng một danh sách sẽ được sử dụng mỗi khi bạn gọi hàm, khi nó được tạo khi hàm được xác định, không phải khi hàm được chạy. – geoffspear

Trả lời

12

Có, tất cả các đối tượng Python sống trên heap (ít nhất là trên CPython.) Chúng được tính tham chiếu: chúng được phân bổ khi tham chiếu cuối cùng đến đối tượng biến mất. (CPython cũng có một bộ thu gom rác để phá vỡ chu kỳ.)

Trong CPython danh sách đầu tiên của bạn biến mất ngay khi hàm trả về vì bạn không ràng buộc giá trị trả lại cho tên và số tham chiếu bị giảm xuống 0. Trong thực hiện khác đối tượng có thể sống lâu hơn cho đến khi bộ thu gom rác bắt đầu.

Một số đối tượng (như tệp mở) có tài nguyên đính kèm tự động giải phóng khi đối tượng được phân phối, nhưng vì nó không được khuyến nghị dựa vào điều này. Tài nguyên phải được đóng một cách rõ ràng khi bạn làm xong chúng.

5

Có, tất cả các giá trị trong CPython được cấp phát trên vùng heap và tính tham chiếu để biết khi nào cần xử lý chúng. Không giống như trong C, không có cách nào để biết trong hầu hết các trường hợp nếu một giá trị sẽ vượt ra ngoài chức năng của nó, vì vậy điều an toàn duy nhất cần làm là phân bổ tất cả mọi thứ. Chắc chắn bạn có thể làm một số phân tích và xác định rằng các giá trị nhất định không bao giờ được chuyển đến các hàm và do đó không thể thoát, nhưng đó là sử dụng hạn chế trong Python và chi phí phụ trội có thể sẽ không đáng giá.

4

Là một bổ sung cho câu trả lời khác, đây là một cách để theo dõi khi thu gom rác xảy ra, bằng cách sử dụng phương pháp đặc biệt __del__:

class Test(object): 
    def __init__(self, name): 
     self.name = name 

    def __del__(self): 
     print "deleting {0}".format(self.name) 

print "discarded instance creation" 
Test("hello") 

print "saved instance creation" 
myList = Test("bye") 

print "program done" 

Output:

 
discarded instance creation 
deleting hello 
saved instance creation 
program done 
deleting bye 

Để biết thêm sâu dữ liệu, xem gc module.

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