Hiểu bản chất tham chiếu trong python?


em chào mọi người, em có sample code này, ở console, em thấy số tham chiếu tới value=10 đã tăng thêm 4.
em đoán lần lượt ở vị trí 1,2,3,4.
em chưa hiểu 1 chuyện: khi gọi hàm f(arg1) hoặc hàm getrefcount(arg2),Tại sao nó không lấy luôn biến arg1 có sẵn ở hàm mẹ show_refcount(arg1), cũng như tại sao nó không lấy luôn biến có sẵn ở hàm mẹ f(arg2), nó không lấy biến có sẵn đó mà khi gọi f(arg1), hay getrefcount(arg2), nó đã tạo 2 biến mới trỏ đến 10, làm cho số tham chiếu tăng 2.
mong mọi người đọc kỹ những gì em hỏi trước khi comment.

cảm ơn ạ!

from sys import getrefcount

def show_refcount(arg1):
    def f(arg2):
        print("số tham chiếu tới 10: ",getrefcount(arg2))
    f(arg1)
       
print("số tham chiếu tới 10: ",getrefcount(10))
print("số tham chiếu tới 10: ",getrefcount(10))
show_refcount(10)

Bạn tìm hiểu cách Python truyền tham số vào hàm nhé.

http://foobarnbaz.com/2012/07/08/understanding-python-variables/

Trích Python Programming FAQ:

Remember that arguments are passed by assignment in Python. Since assignment just creates references to objects, there’s no alias between an argument name in the caller and callee, and so no call-by-reference per se.

Thêm 1 link nữa về Argument Passing:

7 Likes

Theo như mình đọc trên Python Doc thì getrefcount sẽ trả về số tham chiếu của đối tượng. Tổng số được trả về thường cao hơn một số so với bạn có thể mong đợi, vì nó bao gồm tham chiếu (tạm thời) làm đối số cho getrefcount.

Return the reference count of the object . The count returned is generally one higher than you might expect, because it includes the (temporary) reference as an argument to [ getrefcount() ]Nguồn(https://docs.python.org/3/library/sys.html#sys.getrefcount).

Do đó ở đây quá trình tham chiếu sẽ như sau:

  1. Số tham chiếu tới 10 là 14 (kiểm tra bằng hàm print)
  2. Khi dùng hàm tự tạo show_refcount, do đây là hàm trong hàm ( chứa hàm con f(argv)) nên đối số được truyền vào tham số được sử dụng trực tiếp là 2 lần (1 của gọi hàm mẹ và 1 của gọi hàm con), cộng thêm 2 lần tham chiếu tạm thời nữa. Kết quả số tham chiếu tăng lên : 14 + 2 + 2 = 18.

Bạn có thể tìm câu trả lời bằng tiếng anh vì có nhiều dev cũng gặp vấn đề như bạn tại :https://stackoverflow.com/questions/10302133/why-does-sys-getrefcount-return-2

Về hàm, tham số và quan hệ với đối số, bạn có thể tham khảo thêm: Hàm trong Python và mối quan hệ với đối số và tham số.

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