2015-12-23 17 views
12
def some_function(): 
    some_dict = {'random': 'values'} 
    a = some_dict['random'] 
    return a 
  1. Khi được từ điển some_dict tạo ra trong bộ nhớ? (lần đầu tiên chức năng được gọi?)Python: Lifetime (bộ nhớ phạm vi) của các biến cục bộ bên trong một hàm

  2. Khi nào từ điển some_dict bị hủy/không phân bổ? (khi hàm trả về?)

Nếu vậy, điều đó có nghĩa là đối tượng từ điển sẽ được tạo mỗi khi hàm được gọi?

  1. Tôi có nên lo lắng về những điều như vậy khi học/xử lý với python không?

    • Cách tốt nhất để giải quyết các tình huống như vậy là gì? Có tốt hơn không khi tạo từ điển trên toàn cầu để tránh việc tạo và hủy bỏ từ điển mỗi khi hàm được gọi?
  2. Tôi tìm hiểu về chi tiết ngôn ngữ đó ở đâu? Tôi đã thử tìm kiếm tài liệu nhưng không thể tìm thấy những gì tôi đang tìm kiếm.

Cảm ơn bạn trước, nó sẽ được đánh giá cao nếu bạn có thể trả lời tất cả 4 câu hỏi trên!

+0

Chủ đề này có thể cung cấp cho bạn một ý tưởng ngắn gọn về vấn đề của bạn: http://stackoverflow.com/a/20819302/4515274 –

+0

Xem thêm [Tương đương Python của biến tĩnh bên trong một hàm là gì?] (Http:// stackoverflow.com/questions/279561/what-is-the-python-equivalent-of-static-variables-inside-a-function) và các câu hỏi được liên kết trên trang đó. –

Trả lời

7
  1. Từ điển some_dict sẽ được tạo trong bộ nhớ mỗi khi hàm được gọi.
  2. Nó được deallocated khi hàm trả về.
  3. Thực sự tốn kém để tạo lại từ điển mỗi lần duy nhất mà hàm được gọi, đặc biệt nếu từ điển lớn. Thay vào đó, bạn có thể tạo từ điển trong hàm người gọi (giả sử rằng người gọi chính nó chỉ được gọi một lần) và chuyển nó làm đối số cho hàm some_function().

Ví dụ, hãy xem xét các chức năng caller() mà gọi hàm callee (some_function() trong câu hỏi của bạn), như trong

def caller(): 
    callee() 

Từ trường hợp sử dụng của bạn, chúng tôi muốn gọi callee() nhiều lần, và chúng ta cần để sử dụng lại cùng một từ điển trong callee(). Hãy chạy qua các trường hợp sử dụng bình thường.

1. Từ điển được tạo trong callee(). Đây là ví dụ trong câu hỏi của bạn.

def caller(): 
    for loop:  
     callee() 

def callee(dictionary): 
    generate dictionary 
    do something with dictionary 

Trong trường hợp này, mỗi lần callee() được gọi, bạn phải tạo từ điển mới. Điều này là do ngay sau khi trả về callee(), tất cả các biến cục bộ của nó đều được phân bổ lại. Do đó, bạn không thể "sử dụng lại" cùng một từ điển giữa các số callee() s khác nhau.

2. Từ điển được tạo trong caller() và được chuyển làm đối số cho callee().

def caller(): 
    generate dictionary 
    for loop:  
     callee(dictionary) 

def callee(dictionary): 
    do something with dictionary 

Trong trường hợp này, bạn đang tạo ra từ điển một lần trong caller(), và sau đó đi qua nó để mỗi callee() chức năng duy nhất. Do đó, mỗi lần bạn gọi callee(), bạn sẽ không cần phải tạo lại từ điển.

Từ điển được chuyển theo tham chiếu, do đó bạn không chuyển cấu trúc dữ liệu khổng lồ mỗi khi bạn gọi callee(). Tôi sẽ không đi sâu về điều này (bạn có thể tìm thấy một lời giải thích tốt here), nhưng về bản chất, có chi phí không đáng kể để chuyển từ điển như một tham số đến callee().

+1

... và có những bao đóng cũng như những người có thể giữ cho các đối tượng còn sống mặc dù chức năng xác định chúng đã trở lại. –

+0

Tôi không hiểu ý tưởng của việc đặt từ điển trong hàm callee, bởi vì tôi vẫn cần phải gọi 'some_function()' nhiều lần. Bạn có thể vui lòng cho tôi một ví dụ không. – oxalorg

+1

OK vâng, tôi vừa chỉnh sửa câu trả lời của mình để giải quyết vấn đề đó. –

2

Khi nào từ điển some_dict bị hủy/không phân bổ? (khi hàm trả về?)

Trước hết, các biến cục bộ sẽ bị hủy ngay khi bạn rời khỏi phạm vi đó.

Ví dụ: trong hàm của bạn khi bạn trả lại, bạn mất tất cả tham chiếu đến các biến được xác định là some_dict. Vì bạn đang trả lại a và nếu bạn không có một số nội dung như số a_var = some_function() trong đó a tham chiếu sẽ bị bắt trong số a_var bạn cũng sẽ mất a.

Khi nào từ điển some_dict được tạo trong bộ nhớ? (lần đầu tiên chức năng được gọi?)

some_dict = {'random': 'values'} # ngay tại đây cho mọi cuộc gọi phương thức.

Tôi có nên lo lắng về những điều như vậy khi học/xử lý với python không?

có, kiểm tra ví dụ dưới đây

>>> dictionary = {1: 1, 2: 2} 
>>> function() 
>>> def function(): 
    dictionary = {1: 2, 2:1} 
    print dictionary 
>>> function() 
{1: 2, 2: 1} 
>>> dictionary 
{1: 1, 2: 2} 

đây bạn có thể đã giả định rằng bạn đang tái gán điển nhưng trăn đang tạo ra một từ điển địa phương và bị mất ngay sau khi bạn trở về từ chức năng

cách vượt qua vấn đề ở trên, sử dụng toàn cầu, nó sẽ cho biết rằng bạn đang cố gắng tham chiếu đối tượng xác định bên ngoài hàm.

>>> def function(): 
    global dictionary 
    dictionary = {1: 2, 2:1} 
    print dictionary 
>>> function() 
{1: 2, 2: 1} 
>>> dictionary 
{1: 2, 2: 1} 

Nơi nào tôi tìm hiểu về các chi tiết đó của một ngôn ngữ? Tôi đã thử tìm kiếm trong các tài liệu nhưng không thể tìm thấy những gì tôi đang tìm kiếm.

có lẽ câu hỏi phải là how do I learn such details, đơn giản với thực hành và hiểu tài liệu và đọc lại.

+1

'toàn cầu' là một khuyến nghị xấu, nó luôn luôn tốt hơn để vượt qua đối tượng để chức năng. –

+1

Bạn có thể giải thích tại sao một đề xuất xấu toàn cầu không? @Ashwini – saikumarm

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