Vòng đời của biến cục bộ - tham số mặc định trong python

Xin chào
Mình có chút thắc mắc về tham số mặc định - biến cục bộ trong python mong được giải đáp.
Ta có 1 ví du về tham số mặc định, biến cục bộ trong c/c++

#include <iostream>
using namespace std;

int test(int a, int b = 1){
    b += a;
    return b;
}

int main(){
    cout << test(1) << endl << test(2);
    return 0;
}

kết quả

2
3

1 vài nhận xét:

  • b là tham số mặc định, biến cục bộ (khi không được truyền vào sẽ sử dụng)
  • b được tạo ra cho từng lần gọi hàm
  • b chỉ tồn tại đến cuối hàm test là bị hủy
  • b không thể gọi được từ bên ngoài hàm

Tiếp đến ta xem 1 ví dụ bên python

def f(i, values=[]):
    values.append(i)
    return values
f(1)
f(2)
v = f(3)
print(v)

kết quả

[1, 2, 3]

1 vài nhận xét:

  • values là 1 list - tham số mặc định
  • values là 1 biến cục bộ, bên ngoài k gọi được
  • values tồn tại đến khi nào mình k biết, nhưng chạy xong hàm f thì vẫn còn tồn tại (mình nghĩ ít nhất đến khi thu hồi thủ công hoặc khi chương trình bị tắt thì nó mới mất) điều này khác với c/c++ chỉ tồn tại đến cuối hàm
  • values được tạo ra cho n lần gọi hàm

ở trên thì 2 ý cuối:

  • values tồn tại đến khi nào mình k biết, nhưng chạy xong hàm f thì vẫn còn tồn tại (mình nghĩ ít nhất đến khi thu hồi thủ công hoặc khi chương trình bị tắt thì nó mới mất) điều này khác với c/c++ chỉ tồn tại đến cuối hàm
  • values được tạo ra cho n lần gọi hàm (khác với c/c++, tạo ra cho từng lần gọi)

mình thấy khác c/c++, vậy cơ chế hoạt động của biến cục bộ - tham số mặc định trong python là ntn, biến values sẽ tồn tại đến khi nào thì bị hủy?

Xin cảm ơn

Câu trả lời chưa tận tường lắm, nhưng cũng có thể hiểu cơ bản về cơ chế hđ

Ở đây có giải thích:

2 Likes

Post trên cũng giải thích chung chung cách sử dụng, chứ chưa giải thích về cơ chế hđ lắm

bài trong stdio.vn kia cũng có giải thích cơ chế gì đâu? :V

https://docs.python.org/3/faq/programming.html#why-are-default-values-shared-between-objects

Python docs thì có giải thích nè:

It is often expected that a function call creates new objects for default values. This is not what happens. Default values are created exactly once, when the function is defined. If that object is changed, like the dictionary in this example, subsequent calls to the function will refer to this changed object.

ngôn ngữ biến thái premature optimization đi xài lại default object :V

lý do:

This feature can be useful. When you have a function that’s time-consuming to compute, a common technique is to cache the parameters and the resulting value of each call to the function, and return the cached value if the same value is requested again. This is called “memoizing”, and can be implemented like this:

default value là để làm cache nha, cực kì logic vô cùng cực :V :V :V :V

2 Likes

Bài này giải thích
Tham số mặc định là của hàm
Mà hàm qua các lần gọi đều có 1 id không đổi, suy ra các tham số mặc định cũng k được đổi (mặc định của hàm)

Mỗi hàm trong Python sẽ được lưu trong các ô nhớ và chúng ta sẽ kiểm tra thử xem, địa chỉ các ô nhớ này có thay đổi qua mỗi lần gọi hàm test() hay không. Để có thể kiểm tra các địa chỉ ô nhớ của hàm chúng ta sẽ thông qua hàm id(object) được cung cấp bởi Python để lấy giá trị địa chỉ này.

1. print id(test())
2. print id(test())
3. print id(test())

Output:

1. 12511268
2. 12511268
3. 12511268

Theo như output thì giá trị các ô nhớ này không hề thay đổi.

Chúng ta có thể hiểu rằng giá trị ô nhớ không thay đổi tức là giá trị mặc định trong hàm cũng sẽ không thay đổi và qua mỗi lần gọi hàm, khi data.append(1) thì giá trị mặc định data trong hàm cũng sẽ bị thay đổi theo.

Chính vì điều này nên chúng ta sẽ sử dụng các giá trị không thể thay đổi cho tham số mặc định trong hàm nhằm tránh trường hợp giá trị mặc định này bị thay đổi.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?