Làm thế nào để bạn chỉ định một biến tham chiếu trong python?

Các nhà phát triển chuyển sang lập trình Python từ các ngôn ngữ khác như C ++ và Java thường bị nhầm lẫn bởi quá trình truyền đối số trong Python. Mô hình dữ liệu lấy đối tượng làm trung tâm và cách xử lý phân công của nó là nguyên nhân đằng sau sự nhầm lẫn ở cấp độ cơ bản.  

Trong bài viết này, chúng ta sẽ thảo luận về khái niệm về cách truyền giá trị theo tham chiếu trong Python và cố gắng hiểu các ví dụ về truyền tham chiếu trong Python

Truyền theo giá trị và truyền theo tham chiếu trong Python

Bạn có thể muốn đấm một cái gì đó sau khi đọc trước, vì vậy hãy chuẩn bị tinh thần. Mô hình truyền đối số của Python không phải là “Truyền theo giá trị” hay “Truyền theo tham chiếu” mà là “Truyền theo tham chiếu đối tượng”.  

Có thể hiểu các mô hình “Truyền theo giá trị”, “Truyền theo tham chiếu” và “Truyền theo tham chiếu đối tượng” bằng cách khám phá các hàm ví dụ dưới đây. Nhìn vào hai chức năng được xác định dưới đây

Python3




 a = ["X", "Y"]
3
 a = ["X", "Y"]
4
 a = ["X", "Y"]
5
 a = ["X", "Y"]
6

 a = ["X", "Y"]
7
 a = ["X", "Y"]
5
 a = ["X", "Y"]
9
 a = ["X", "Y"]
0
 a = ["X", "Y"]
0
 a = ["X", "Y"]
1
 a = ["X", "Y"]
2
 a = ["X", "Y"]
1
 a = ["X", "Y"]
4
 a = ["X", "Y"]
5

 a = ["X", "Y"]
7
 a = ["X", "Y"]
7
 a = ["X", "Y"]
5

 

 a = ["X", "Y"]
3
 a = ["X", "Y"]
30
 a = ["X", "Y"]
5
 a = ["X", "Y"]
6

 a = ["X", "Y"]
7____25
 a = ["X", "Y"]
35____236
 a = ["X", "Y"]
37

 a = ["X", "Y"]
7
 a = ["X", "Y"]
7
 a = ["X", "Y"]
5

 

 a = ["X", "Y"]
41
 a = ["X", "Y"]
9
 a = ["X", "Y"]
0
 a = ["X", "Y"]
44
 a = ["X", "Y"]
5

 

 a = ["X", "Y"]
46____247

 

 a = ["X", "Y"]
46____249

đầu ra

['A', 'B', 'C']
['E', 'D']

Bây giờ, hãy cùng khám phá đoạn mã trên,

Biến không phải là đối tượng

Ở đây “a” là một biến trỏ đến một danh sách chứa phần tử “X” và “Y”. Nhưng bản thân “a” không phải là danh sách. Coi “a” là một nhóm chứa đối tượng “X” và “Y”.  

 a = ["X", "Y"]

 

Pass by Reference trong Python là gì?

Truyền theo tham chiếu có nghĩa là bạn phải truyền hàm [tham chiếu] cho một biến chỉ rằng biến đó đã tồn tại trong bộ nhớ.  

Ở đây, biến [cái xô] được truyền trực tiếp vào hàm. Biến hoạt động như một Gói đi kèm với nội dung của nó [các đối tượng]

 

Trong hình ảnh mã ở trên, cả “list” và “my_list” đều là cùng một biến vùng chứa và do đó đề cập đến chính xác cùng một đối tượng trong bộ nhớ. Bất kỳ hoạt động nào được thực hiện bởi hàm trên biến hoặc đối tượng sẽ được phản ánh trực tiếp bởi người gọi hàm. Chẳng hạn, hàm có thể thay đổi hoàn toàn nội dung của biến và trỏ nó vào một đối tượng hoàn toàn khác.  

 

Ngoài ra, hàm có thể gán lại nội dung của biến với tác dụng tương tự như bên dưới.  

 

Tóm lại, trong tham chiếu chuyển qua, hàm và người gọi sử dụng cùng một biến và đối tượng

Truyền theo giá trị trong Python là gì?

Theo cách tiếp cận này, chúng tôi chuyển một bản sao của các biến thực trong hàm dưới dạng tham số. Do đó, bất kỳ sửa đổi nào đối với các tham số bên trong hàm sẽ không phản ánh trong biến thực tế

 

Điều này cũng đúng với mọi thao tác được thực hiện bởi hàm trên biến hoặc đối tượng

 

Để tóm tắt các bản sao của các biến và các đối tượng trong ngữ cảnh của người gọi hàm là hoàn toàn bị cô lập

Trong python khi chúng ta gán một giá trị cho một tên, chúng ta thực sự tạo một đối tượng và một tham chiếu đến nó. Ví dụ: trong a=1, một đối tượng có giá trị '1' được tạo trong bộ nhớ và tham chiếu 'a' hiện trỏ tới nó. Bởi vì tôi đã chuyển sang python sau khi lập trình bằng C một thời gian, tôi đã từng nghĩ rằng nếu tôi thêm một câu lệnh gán khác vào cùng một mã [giữ nguyên giá trị] thì tôi. e. b=1, một đối tượng mới sẽ được tạo và một tham chiếu mới 'b' sẽ trỏ tới nó. Nhưng tôi đã sai. Điều đó khiến tôi bắt đầu tìm hiểu ý nghĩa của việc đếm tham chiếu và cách nó hoạt động trong Python. Hãy xem đoạn mã ví dụ sau và cách nó thực thi

 a = ["X", "Y"]
1

Đối với câu lệnh đầu tiên như chúng ta đã thống nhất ở trên, một đối tượng trong bộ nhớ được khởi tạo với giá trị 1. Một tham chiếu 'a' được thêm vào nó và số lượng tham chiếu của '1' tăng. Khi Python thực thi câu lệnh tiếp theo b=1, vì nó có cùng giá trị [1], một đối tượng mới không được khởi tạo. Cùng một đối tượng trong bộ nhớ với giá trị 1 chỉ có một tham chiếu khác 'b' được thêm vào nó. Đây là một phần của quy trình quản lý bộ nhớ Python. Đối với c=2, một đối tượng mới được tạo lại vì nó có giá trị mới là 2 với c làm tham chiếu hiện đang trỏ đến nó

Chúng ta có thể kiểm tra số lượng tham chiếu của mọi đối tượng trong python bằng cách nhập thư viện python module-sys và truy cập hàm getrefcount của nó

 a = ["X", "Y"]
2

Chúng ta cũng có thể hiểu điều này tốt hơn bằng cách truy cập các địa chỉ bộ nhớ được liên kết với các giá trị này bằng cách sử dụng mô-đun id. a, b đề cập đến cùng một địa chỉ trong bộ nhớ và c đề cập đến một địa chỉ khác. Đoạn mã sau được thực thi bằng ipython

 a = ["X", "Y"]
3

Đây là cách nó trông thú vị trong danh sách

 a = ["X", "Y"]
4

Tất cả các phần tử của danh sách chỉ đề cập đến một địa chỉ chứa giá trị 1

Tham chiếu biếnPythonListsPhân bổ bộ nhớ

Báo cáo

Thưởng thức bài viết này?

7

Đăng lại

vòm B

Nhà phát triển phần mềm, Cố vấn

Quan tâm đến nhu cầu của người dùng, tôi thích giảng dạy và cố vấn đặc biệt cho người mới bắt đầu. . ] Hiện tại công việc của tôi trong lĩnh vực Công nghệ là vì những kết quả Hạnh phúc và Hạnh phúc tốt hơn. Tôi cũng thích nghiên cứu Tương tác máy tính của con người và cách điều chỉnh nó cho phù hợp.

Theo dõi

Khám phá và đọc thêm các bài đăng từ Arch B

bắt đầu

Thưởng thức bài viết này?

Để lại một lượt thích và bình luận cho Arch

7

Hãy là người đầu tiên chia sẻ ý kiến ​​của bạn

Hỗ trợ đánh dấu hương vị GitHub

Gửi đi

Vajravelu Mani

3 năm trước

sẽ hữu ích hơn nếu sys. getrefcount[] được tổ chức ngày càng nhiều
tôi không thể làm cho nó hoạt động

 a = ["X", "Y"]
2
 a = ["X", "Y"]
3
 a = ["X", "Y"]
4
 a = ["X", "Y"]
3
 a = ["X", "Y"]
6
 a = ["X", "Y"]
7
 a = ["X", "Y"]
20
 a = ["X", "Y"]
7
 a = ["X", "Y"]
22
 a = ["X", "Y"]
7

 a = ["X", "Y"]
24
 a = ["X", "Y"]
25
 a = ["X", "Y"]
26
 a = ["X", "Y"]
25
 a = ["X", "Y"]
28
 a = ["X", "Y"]
29

giá trị trả về cho sys là gì. getrefcount[] có nghĩa là gì?

Đáp lại

vòm B

3 năm trước

Xin chào

Có thể giá trị 1 đang được sử dụng ở nơi khác trong mã Python hoặc shell của bạn. Bạn đã viết bất kỳ đoạn mã nào trước mã này trong cùng một trình bao chưa?

Đáp lại

vòm B

3 năm trước

Bạn có thể muốn kiểm tra nó bằng cách gán lại a hoặc b cho một giá trị khác như a=2 và xem liệu giá trị sysrefcount[1] có giảm đi 1

Đáp lại

Rafal Skolasinski

4 năm trước

Số nguyên nhỏ là đặc biệt. Chúng thực sự là cùng một đối tượng cho mục đích tối ưu hóa. Nếu bạn kiểm tra một số cái cao hơn thì chúng sẽ khác

Đáp lại

vòm B

4 năm trước

Thanks. That is interesting to know and makes sense. I did try for very big noes after seeing your comment and also modifying the list like l=[1000008971, 890123455555, 1000008971, 1000008971] but only see the address 140373007772400 [] being used. I am using python 2.7 and also I guess the computations maybe processor CPU dependent?

Đáp lại

Rafal Skolasinski

4 năm trước

Kiểm tra liên kết này, tôi nghĩ cuộc thảo luận ở đó bao trùm nó tốt hơn trí nhớ của tôi. https. // stackoverflow. com/câu hỏi/306313/is-operator-behaves-unexpectedly-with-integer

Đáp lại

vòm B

4 năm trước

Khi tôi chạy mã riêng trên ipython, tôi thấy sự khác biệt khi bạn đề cập trong nhận xét đầu tiên của mình đối với x và y là số nguyên nhỏ và số nguyên lớn. Tôi nghĩ trong trường hợp cụ thể này bởi vì nó là một danh sách - nó có liên quan đến khả năng biến đổi và phân bổ bộ nhớ liền kề. Tôi đã tìm thấy một liên kết khác về quản lý bộ nhớ python cũng có thể hữu ích- https. // stackoverflow. com/câu hỏi/11596371/how-does-python-memory-manager-work. Nó đề cập rằng quản lý bộ nhớ hoạt động khác nhau đối với các loại dữ liệu khác nhau

Chủ Đề