Địa chỉ bộ nhớ trong Python

Tôi sẽ thảo luận về 'Cách tìm địa chỉ bộ nhớ của một biến' trong Python. Sau đây tôi sẽ hướng dẫn chi tiết cho các bạn cách tìm địa chỉ của các biến

Tìm địa chỉ của một biến bằng id() trong Python

Hãy xem xét một người P sống ở Kolkata, nếu chúng ta muốn lấy địa chỉ của P, thì đó sẽ là Kolkata

  • Trước hết, chúng ta có thể tìm địa chỉ của một biến bằng hàm id .
  • Hàm này trả về một số nguyên cho biết địa chỉ ảo của biến đó

Ví dụ

var1 = 10
print(id(var1))
var2 = 12
print(id(var2))
Output:
2037008656
2037008688
  • Kết quả là giá trị thập phân trên 10 chữ số cung cấp tham chiếu bộ nhớ của các biến var1 và var2. Bạn có thể nhận được giá trị khác nhau của địa chỉ dựa trên hệ thống của bạn
  • Bạn cũng có thể làm tương tự để tìm địa chỉ tương tự cho một float, chuỗi, hàm hoặc một đối tượng. Bởi vì khi bạn khởi tạo một trình biên dịch biến dường như dành không gian bộ nhớ cho chúng trên một giá trị địa chỉ khác
  • Dưới đây đưa ra một ví dụ cung cấp địa chỉ của hàm sum
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
Output:
Address of funtion sum: 55575944

⇒Bạn cũng có thể sử dụng id() với đối tượng lớp, nó sẽ cung cấp tham chiếu của đối tượng đó

  • Hơn nữa, trên tất cả các địa chỉ là Số nguyên nhưng bạn có thể thấy nhiều lần rằng địa chỉ bộ nhớ được ghi ở định dạng thập lục phân
  • Trên tất cả các địa chỉ có thể được chuyển đổi sang định dạng thập lục phân bằng chức năng hex
  • While hex() trả về giá trị thập lục phân để in địa chỉ.
var1 = 2.60
print(hex(id(var1))) # print the address of var1 in hexadecimal format
var2 = 3.90
print(hex(id(var2))) #print the address of var2 in hexadecimal format
str1="Hello"
print(hex(id(str1))) #print the address of str1 in hexadecimal format
Output:
'0x353a208'
'0x3500588'
'0x352f180'

Do đó bạn có thể sử dụng id() để tìm địa chỉ của các biến trong Python

Cũng đọc. Hàm id() trong Python

Một phản hồi cho “Tìm địa chỉ bộ nhớ của một biến trong Python”

  1. Tiến sĩ. Sai B K nói.

    Tôi có một danh sách trong một biến.
    A=[25,34,-12]
    Tôi muốn gán danh sách A cho một biến 'z' khác trong chương trình (không phải thủ công)what can be the code? Can the id() be used for this task? if yes, how?

Để lại một câu trả lời

Địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu *

Nhận xét *

Tên *

Email *

Vui lòng bật JavaScript để gửi biểu mẫu này

Nếu bạn đã từng làm việc với các ngôn ngữ cấp thấp hơn như C hoặc C++, thì có lẽ bạn đã nghe nói về con trỏ. Con trỏ cho phép bạn tạo hiệu quả cao trong các phần mã của mình. Chúng cũng gây nhầm lẫn cho người mới bắt đầu và có thể dẫn đến các lỗi quản lý bộ nhớ khác nhau, ngay cả đối với các chuyên gia. Vậy chúng ở đâu trong Python và làm cách nào bạn có thể mô phỏng con trỏ trong Python?

Con trỏ được sử dụng rộng rãi trong C và C++. Về cơ bản, chúng là các biến chứa địa chỉ bộ nhớ của một biến khác. Để ôn lại về con trỏ, bạn có thể cân nhắc xem phần tổng quan này về Con trỏ C

Trong bài viết này, bạn sẽ hiểu rõ hơn về mô hình đối tượng của Python và tìm hiểu lý do tại sao con trỏ trong Python không thực sự tồn tại. Đối với những trường hợp bạn cần bắt chước hành vi của con trỏ, bạn sẽ học cách mô phỏng con trỏ trong Python mà không gặp cơn ác mộng về quản lý bộ nhớ

Trong bài viết này, bạn sẽ

  • Tìm hiểu tại sao con trỏ trong Python không tồn tại
  • Khám phá sự khác biệt giữa biến C và tên Python
  • Mô phỏng con trỏ trong Python
  • Thử nghiệm với con trỏ thực bằng cách sử dụng
    >>> s[0] = "R"
    Traceback (most recent call last):
      File "", line 1, in 
    TypeError: 'str' object does not support item assignment
    
    1

Ghi chú. Trong bài viết này, “Python” sẽ đề cập đến việc triển khai tham chiếu Python trong C, hay còn gọi là CPython. Vì bài viết thảo luận về một số phần bên trong của ngôn ngữ, những ghi chú này đúng với CPython 3. 7 nhưng có thể không đúng trong các lần lặp lại ngôn ngữ trong tương lai hoặc quá khứ

Tải xuống miễn phí. Nhận một chương mẫu từ Thủ thuật Python. Cuốn sách chỉ cho bạn các phương pháp hay nhất về Python với các ví dụ đơn giản mà bạn có thể áp dụng ngay lập tức để viết mã Pythonic + đẹp hơn

Tại sao Python không có con trỏ?

sự thật là tôi không biết. Con trỏ trong Python có thể tồn tại tự nhiên không? . Con trỏ khuyến khích những thay đổi tiềm ẩn hơn là rõ ràng. Thông thường, chúng phức tạp thay vì đơn giản, đặc biệt là đối với người mới bắt đầu. Tệ hơn nữa, họ cầu xin những cách để tự bắn vào chân mình, hoặc làm điều gì đó thực sự nguy hiểm như đọc từ một phần ký ức mà bạn không được phép đọc.

Python có xu hướng cố gắng trừu tượng hóa các chi tiết triển khai như địa chỉ bộ nhớ từ người dùng của nó. Python thường tập trung vào khả năng sử dụng thay vì tốc độ. Kết quả là, con trỏ trong Python không thực sự có ý nghĩa. Mặc dù vậy, đừng sợ, theo mặc định, Python cung cấp cho bạn một số lợi ích của việc sử dụng con trỏ

Hiểu con trỏ trong Python yêu cầu một đường vòng ngắn vào chi tiết triển khai của Python. Cụ thể, bạn sẽ cần phải hiểu

  1. Đối tượng không thay đổi so với đối tượng có thể thay đổi
  2. Biến/tên Python

Giữ địa chỉ bộ nhớ của bạn và bắt đầu

Loại bỏ các quảng cáo

Các đối tượng trong Python

Trong Python, mọi thứ đều là đối tượng. Để chứng minh, bạn có thể mở REPL và khám phá bằng cách sử dụng

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
2

>>>

>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
..     pass
...
>>> isinstance(foo, object)
True

Mã này cho bạn thấy rằng mọi thứ trong Python thực sự là một đối tượng. Mỗi đối tượng chứa ít nhất ba mẩu dữ liệu

  • số tham chiếu
  • Loại
  • Giá trị

Dành cho quản lý bộ nhớ. Để có cái nhìn sâu hơn về nội dung quản lý bộ nhớ trong Python, bạn có thể đọc Quản lý bộ nhớ trong Python

Loại được sử dụng ở lớp CPython để đảm bảo an toàn cho loại trong thời gian chạy. Cuối cùng, có giá trị, là giá trị thực được liên kết với đối tượng

Mặc dù không phải tất cả các đối tượng đều giống nhau. Có một điểm khác biệt quan trọng khác mà bạn cần hiểu. đối tượng bất biến vs đối tượng có thể thay đổi. Hiểu được sự khác biệt giữa các loại đối tượng thực sự giúp làm rõ lớp đầu tiên của hành tây đó là con trỏ trong Python

Đối tượng bất biến và có thể thay đổi

Trong Python, có hai loại đối tượng

  1. Đối tượng bất biến không thể thay đổi
  2. Các đối tượng có thể thay đổi có thể được thay đổi

Hiểu sự khác biệt này là chìa khóa đầu tiên để điều hướng bối cảnh của các con trỏ trong Python. Đây là bảng phân tích các loại phổ biến và liệu chúng có thể thay đổi hay không thay đổi

LoạiKhông thể thay đổi?

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
3Có
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
4Có
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
5Có
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
6Có
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7Có
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
8Có
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
9Có
Output:
2037008656
2037008688
60Không
Output:
2037008656
2037008688
61Không
Output:
2037008656
2037008688
62Không

Như bạn có thể thấy, rất nhiều kiểu nguyên thủy thường được sử dụng là bất biến. Bạn có thể tự chứng minh điều này bằng cách viết một số Python. Bạn sẽ cần một vài công cụ từ thư viện chuẩn Python

  1. Output:
    2037008656
    2037008688
    
    63 trả về địa chỉ bộ nhớ của đối tượng
  2. Output:
    2037008656
    2037008688
    
    64 trả về
    Output:
    2037008656
    2037008688
    
    65 khi và chỉ khi hai đối tượng có cùng địa chỉ bộ nhớ

Một lần nữa, bạn có thể sử dụng chúng trong môi trường REPL

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
2

Trong đoạn mã trên, bạn đã gán giá trị

Output:
2037008656
2037008688
66 cho
Output:
2037008656
2037008688
67. Nếu bạn cố sửa đổi giá trị này bằng phép cộng, thì bạn sẽ nhận được một đối tượng mới

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
5

Mặc dù đoạn mã trên dường như sửa đổi giá trị của

Output:
2037008656
2037008688
67, bạn vẫn nhận được một đối tượng mới làm phản hồi

Loại

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
9 cũng không thay đổi

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
8

Một lần nữa,

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
90 kết thúc với một địa chỉ bộ nhớ khác sau thao tác
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
91

Thưởng. Toán tử

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
91 dịch sang các lệnh gọi phương thức khác nhau

Đối với một số đối tượng như

Output:
2037008656
2037008688
60, thì
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
91 sẽ chuyển thành
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
95 (thêm tại chỗ). Điều này sẽ sửa đổi
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
96 và trả về cùng một ID. Tuy nhiên,
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
9 và
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
3 không có các phương thức này và dẫn đến các cuộc gọi
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
99 thay vì
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
95

Để biết thêm thông tin chi tiết, hãy xem Python

Cố gắng thay đổi trực tiếp chuỗi

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
90 dẫn đến lỗi

>>>

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment

Đoạn mã trên không thành công và Python chỉ ra rằng

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
9 không hỗ trợ đột biến này, điều này phù hợp với định nghĩa rằng loại
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
9 là bất biến

Ngược lại với một đối tượng có thể thay đổi, như

Output:
2037008656
2037008688
60

>>>

Output:
2037008656
2037008688
6

Mã này cho thấy sự khác biệt lớn trong hai loại đối tượng.

var1 = 2.60
print(hex(id(var1))) # print the address of var1 in hexadecimal format
var2 = 3.90
print(hex(id(var2))) #print the address of var2 in hexadecimal format
str1="Hello"
print(hex(id(str1))) #print the address of str1 in hexadecimal format
65 ban đầu có id. Ngay cả sau khi
var1 = 2.60
print(hex(id(var1))) # print the address of var1 in hexadecimal format
var2 = 3.90
print(hex(id(var2))) #print the address of var2 in hexadecimal format
str1="Hello"
print(hex(id(str1))) #print the address of str1 in hexadecimal format
66 được thêm vào danh sách, thì
var1 = 2.60
print(hex(id(var1))) # print the address of var1 in hexadecimal format
var2 = 3.90
print(hex(id(var2))) #print the address of var2 in hexadecimal format
str1="Hello"
print(hex(id(str1))) #print the address of str1 in hexadecimal format
65 vẫn có cùng một id. Điều này là do loại
Output:
2037008656
2037008688
60 có thể thay đổi

Một cách khác để chứng minh rằng danh sách có thể thay đổi được là gán

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
9

Trong mã này, bạn biến đổi

var1 = 2.60
print(hex(id(var1))) # print the address of var1 in hexadecimal format
var2 = 3.90
print(hex(id(var2))) #print the address of var2 in hexadecimal format
str1="Hello"
print(hex(id(str1))) #print the address of str1 in hexadecimal format
65 và đặt phần tử đầu tiên của nó thành
Output:
'0x353a208'
'0x3500588'
'0x352f180'
20. Tuy nhiên, nó vẫn duy trì cùng một id ngay cả sau khi chuyển nhượng này. Với các đối tượng có thể thay đổi và không thể thay đổi, bước tiếp theo trong hành trình của bạn là tìm hiểu hệ sinh thái có thể thay đổi của Python

Loại bỏ các quảng cáo

Hiểu các biến

Các biến trong Python về cơ bản khác với các biến trong C hoặc C++. Trên thực tế, Python thậm chí không có biến. Python có tên, không phải biến

Điều này có vẻ khoa trương, và phần lớn, nó là. Hầu hết thời gian, bạn hoàn toàn có thể coi tên Python là biến, nhưng hiểu được sự khác biệt là rất quan trọng. Điều này đặc biệt đúng khi bạn đang điều hướng chủ đề phức tạp của con trỏ trong Python

Để giúp hiểu rõ sự khác biệt, bạn có thể xem cách các biến hoạt động trong C, chúng đại diện cho cái gì và sau đó đối chiếu điều đó với cách các tên hoạt động trong Python

Biến trong C

Giả sử bạn có đoạn mã sau xác định biến

Output:
2037008656
2037008688
67

var1 = 2.60
print(hex(id(var1))) # print the address of var1 in hexadecimal format
var2 = 3.90
print(hex(id(var2))) #print the address of var2 in hexadecimal format
str1="Hello"
print(hex(id(str1))) #print the address of str1 in hexadecimal format
6

Một dòng mã này có một số bước riêng biệt khi được thực thi

  1. Cấp phát đủ bộ nhớ cho một số nguyên
  2. Gán giá trị
    Output:
    '0x353a208'
    '0x3500588'
    '0x352f180'
    22 cho vị trí bộ nhớ đó
  3. Cho biết rằng
    Output:
    2037008656
    2037008688
    
    67 trỏ đến giá trị đó

Được hiển thị trong chế độ xem đơn giản hóa của bộ nhớ, nó có thể trông như thế này

Địa chỉ bộ nhớ trong Python

Ở đây, bạn có thể thấy rằng biến

Output:
2037008656
2037008688
67 có vị trí bộ nhớ giả mạo là
Output:
'0x353a208'
'0x3500588'
'0x352f180'
25 và giá trị
Output:
'0x353a208'
'0x3500588'
'0x352f180'
22. Nếu sau này trong chương trình, bạn muốn thay đổi giá trị của
Output:
2037008656
2037008688
67, bạn có thể làm như sau

Output:
'0x353a208'
'0x3500588'
'0x352f180'
2

Đoạn mã trên gán một giá trị mới (

Output:
'0x353a208'
'0x3500588'
'0x352f180'
28) cho biến
Output:
2037008656
2037008688
67, do đó ghi đè lên giá trị trước đó. Điều này có nghĩa là biến
Output:
2037008656
2037008688
67 có thể thay đổi. Bố cục bộ nhớ được cập nhật hiển thị giá trị mới

Địa chỉ bộ nhớ trong Python

Lưu ý rằng vị trí của

Output:
2037008656
2037008688
67 không thay đổi, chỉ có giá trị. Đây là một điểm đáng kể. Điều đó có nghĩa là
Output:
2037008656
2037008688
67 là vị trí bộ nhớ, không chỉ là tên cho nó

Một cách khác để nghĩ về khái niệm này là về quyền sở hữu. Theo một nghĩa nào đó,

Output:
2037008656
2037008688
67 sở hữu vị trí bộ nhớ. Ban đầu,
Output:
2037008656
2037008688
67 là một hộp trống có thể chứa chính xác một số nguyên trong đó các giá trị số nguyên có thể được lưu trữ

Khi bạn gán một giá trị cho

Output:
2037008656
2037008688
67, bạn đang đặt một giá trị vào ô mà
Output:
2037008656
2037008688
67 sở hữu. Nếu bạn muốn giới thiệu một biến mới (
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
17), bạn có thể thêm dòng mã này

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
1

Mã này tạo một hộp mới có tên là

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
17 và sao chép giá trị từ
Output:
2037008656
2037008688
67 vào hộp. Bây giờ bố cục bộ nhớ sẽ như thế này

Địa chỉ bộ nhớ trong Python

Thông báo vị trí mới

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
200 của
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
17. Mặc dù giá trị của
Output:
2037008656
2037008688
67 đã được sao chép sang
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
17, biến
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
17 sở hữu một số địa chỉ mới trong bộ nhớ. Do đó, bạn có thể ghi đè lên giá trị của
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
17 mà không ảnh hưởng đến
Output:
2037008656
2037008688
67

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
20

Bây giờ bố cục bộ nhớ sẽ như thế này

Địa chỉ bộ nhớ trong Python

Một lần nữa, bạn đã sửa đổi giá trị tại

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
17, nhưng không sửa đổi vị trí của nó. Ngoài ra, bạn hoàn toàn không ảnh hưởng đến biến
Output:
2037008656
2037008688
67 ban đầu. Điều này hoàn toàn trái ngược với cách hoạt động của tên Python

Loại bỏ các quảng cáo

Tên trong Python

Python không có biến. Nó có tên. Vâng, đây là một điểm mô phạm và bạn chắc chắn có thể sử dụng thuật ngữ biến bao nhiêu tùy thích. Điều quan trọng cần biết là có sự khác biệt giữa các biến và tên

Hãy lấy mã tương đương từ ví dụ C ở trên và viết nó bằng Python

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
21

Giống như trong C, đoạn mã trên được chia thành nhiều bước riêng biệt trong quá trình thực thi

  1. Tạo một
    def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    209
  2. Đặt mã loại thành số nguyên cho
    def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    209
  3. Đặt giá trị thành
    Output:
    '0x353a208'
    '0x3500588'
    '0x352f180'
    22 cho
    def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    209
  4. Tạo một tên gọi là
    Output:
    2037008656
    2037008688
    
    67
  5. Điểm
    Output:
    2037008656
    2037008688
    
    67 đến
    def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    209 mới
  6. Tăng số lần đếm lại của
    def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    209 lên 1

Ghi chú. Điều này không giống với

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
218 của Python. Nó dành riêng cho CPython và đại diện cho cấu trúc cơ sở cho tất cả các đối tượng Python

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
209 được định nghĩa là một cấu trúc C, vì vậy nếu bạn đang thắc mắc tại sao bạn không thể gọi trực tiếp
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
220 hoặc
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
221, thì đó là vì bạn không có quyền truy cập trực tiếp vào cấu trúc. Các cuộc gọi phương thức như có thể giúp nhận được một số nội bộ

Trong bộ nhớ, nó có thể trông giống như thế này

Địa chỉ bộ nhớ trong Python

Bạn có thể thấy rằng cách bố trí bộ nhớ khác rất nhiều so với cách bố trí C trước đây. Thay vì

Output:
2037008656
2037008688
67 sở hữu khối bộ nhớ chứa giá trị
Output:
'0x353a208'
'0x3500588'
'0x352f180'
22, đối tượng Python mới được tạo sẽ sở hữu bộ nhớ chứa
Output:
'0x353a208'
'0x3500588'
'0x352f180'
22. Tên Python
Output:
2037008656
2037008688
67 không sở hữu trực tiếp bất kỳ địa chỉ bộ nhớ nào theo cách mà biến C
Output:
2037008656
2037008688
67 sở hữu một vị trí tĩnh trong bộ nhớ

Nếu bạn định gán một giá trị mới cho

Output:
2037008656
2037008688
67, bạn có thể thử cách sau

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
22

Những gì đang xảy ra ở đây khác với tương đương với C, nhưng không quá khác so với ràng buộc ban đầu trong Python

mã này

  • Tạo một
    def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    209 mới
  • Đặt mã loại thành số nguyên cho
    def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    209
  • Đặt giá trị thành
    Output:
    '0x353a208'
    '0x3500588'
    '0x352f180'
    28 cho
    def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    209
  • Điểm
    Output:
    2037008656
    2037008688
    
    67 đến
    def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    209 mới
  • Tăng số lượng truy cập của
    def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    209 mới lên 1
  • Giảm số lượng truy cập của
    def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    209 cũ xuống 1

Bây giờ trong bộ nhớ, nó sẽ giống như thế này

Địa chỉ bộ nhớ trong Python

Sơ đồ này giúp minh họa rằng

Output:
2037008656
2037008688
67 trỏ đến một tham chiếu đến một đối tượng và không sở hữu không gian bộ nhớ như trước đây. Nó cũng chỉ ra rằng lệnh
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
238 không phải là một phép gán, mà là ràng buộc tên
Output:
2037008656
2037008688
67 với một tham chiếu

Ngoài ra, đối tượng trước đó (giữ giá trị

Output:
'0x353a208'
'0x3500588'
'0x352f180'
22) hiện đang nằm trong bộ nhớ với số tham chiếu là 0 và sẽ được dọn sạch bởi

Bạn có thể giới thiệu một tên mới,

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
17, cho hỗn hợp như trong ví dụ C

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
23

Trong bộ nhớ, bạn sẽ có một tên mới, nhưng không nhất thiết phải là một đối tượng mới

Địa chỉ bộ nhớ trong Python

Bây giờ bạn có thể thấy rằng một đối tượng Python mới chưa được tạo, chỉ có một tên mới trỏ đến cùng một đối tượng. Ngoài ra, số lượt truy cập của đối tượng đã tăng thêm một. Bạn có thể kiểm tra sự bình đẳng nhận dạng đối tượng để xác nhận rằng chúng giống nhau

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
24

Đoạn mã trên chỉ ra rằng

Output:
2037008656
2037008688
67 và
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
17 là cùng một đối tượng. mặc dù không phạm sai lầm.
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
17 vẫn bất biến

Ví dụ: bạn có thể thực hiện phép cộng trên

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
17

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
25

Sau lệnh gọi bổ sung, bạn được trả về một đối tượng Python mới. Bây giờ, bộ nhớ trông như thế này

Địa chỉ bộ nhớ trong Python

Một đối tượng mới đã được tạo và

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
17 hiện trỏ đến đối tượng mới. Thật thú vị, đây là trạng thái kết thúc tương tự nếu bạn đã ràng buộc trực tiếp
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
17 với
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
248

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
26

Câu lệnh trên dẫn đến trạng thái bộ nhớ cuối giống như phần bổ sung. Tóm lại, trong Python, bạn không gán biến. Thay vào đó, bạn liên kết tên với tài liệu tham khảo

Loại bỏ các quảng cáo

Lưu ý về các đối tượng thực tập trong Python

Bây giờ bạn đã hiểu cách các đối tượng Python được tạo và các tên được liên kết với các đối tượng đó, đã đến lúc bắt tay vào thực hiện. Cờ lê đó đi theo tên của các đối tượng được thực tập

Giả sử bạn có mã Python sau

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
27

Như trên,

Output:
2037008656
2037008688
67 và
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
17 đều là tên trỏ đến cùng một đối tượng Python. Nhưng đối tượng Python chứa giá trị
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
251 không phải lúc nào cũng đảm bảo có cùng địa chỉ bộ nhớ. Ví dụ: nếu bạn cộng hai số lại với nhau để có được
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
251, bạn sẽ nhận được một địa chỉ bộ nhớ khác

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
28

Lần này, dòng

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
253 trả về
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
254. Nếu điều này gây nhầm lẫn, thì đừng lo lắng. Dưới đây là các bước xảy ra khi mã này được thực thi

  1. Tạo đối tượng Python(
    def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    251)
  2. Gán tên
    Output:
    2037008656
    2037008688
    
    67 cho đối tượng đó
  3. Tạo đối tượng Python (
    def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    257)
  4. Tạo đối tượng Python (
    def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    258)
  5. Cộng hai đối tượng này lại với nhau
  6. Tạo một đối tượng Python mới (
    def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    251)
  7. Gán tên
    >>> s[0] = "R"
    Traceback (most recent call last):
      File "", line 1, in 
    TypeError: 'str' object does not support item assignment
    
    17 cho đối tượng đó

Lưu ý kỹ thuật. Các bước trên chỉ xảy ra khi mã này được thực thi bên trong REPL. Nếu bạn lấy ví dụ trên, dán nó vào một tệp và chạy tệp đó, thì bạn sẽ thấy rằng dòng

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
253 sẽ trả về
Output:
2037008656
2037008688
65

Điều này xảy ra bởi vì trình biên dịch thông minh. Trình biên dịch CPython cố gắng thực hiện các tối ưu hóa được gọi là tối ưu hóa lỗ nhìn trộm, giúp lưu các bước thực hiện bất cứ khi nào có thể. Để biết thông tin chi tiết, bạn có thể xem mã nguồn trình tối ưu hóa lỗ nhìn trộm của CPython

Đây không phải là lãng phí sao? . Bạn không bao giờ phải lo lắng về việc dọn dẹp các đối tượng trung gian này hoặc thậm chí không cần biết rằng chúng tồn tại. Điều thú vị là các thao tác này tương đối nhanh và bạn chưa bao giờ phải biết bất kỳ chi tiết nào trong số đó cho đến bây giờ

Các nhà phát triển cốt lõi của Python, theo sự khôn ngoan của họ, cũng nhận thấy sự lãng phí này và quyết định thực hiện một số tối ưu hóa. Những tối ưu hóa này dẫn đến hành vi có thể gây ngạc nhiên cho người mới

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
29

Trong ví dụ này, bạn thấy mã gần giống như trước, ngoại trừ lần này kết quả là

Output:
2037008656
2037008688
65. Đây là kết quả của các đối tượng được thực tập. Python tạo trước một tập hợp con nhất định các đối tượng trong bộ nhớ và giữ chúng trong không gian tên chung để sử dụng hàng ngày

Đối tượng nào phụ thuộc vào việc triển khai Python. Trăn 3. 7 thực tập sinh sau

  1. Số nguyên giữa
    def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    264 và
    def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    265
  2. Các chuỗi chỉ chứa các chữ cái, chữ số hoặc dấu gạch dưới ASCII

Lý do đằng sau điều này là các biến này rất có khả năng được sử dụng trong nhiều chương trình. Bằng cách thực tập các đối tượng này, Python ngăn các cuộc gọi cấp phát bộ nhớ cho các đối tượng được sử dụng nhất quán

Các chuỗi có ít hơn 20 ký tự và chứa các chữ cái, chữ số hoặc dấu gạch dưới ASCII sẽ được thực tập. Lý do đằng sau điều này là chúng được coi là một loại danh tính nào đó

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
50

Ở đây bạn có thể thấy rằng cả

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
266 và
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
267 đều trỏ đến cùng một địa chỉ trong bộ nhớ. Nếu bạn nhập một chữ cái, chữ số hoặc dấu gạch dưới không phải ASCII, thì bạn sẽ nhận được một kết quả khác

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
51

Bởi vì ví dụ này có dấu chấm than (

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
268) trong đó, các chuỗi này không được thực hiện và là các đối tượng khác nhau trong bộ nhớ

Thưởng. Nếu bạn thực sự muốn các đối tượng này tham chiếu cùng một đối tượng bên trong, thì bạn có thể muốn xem

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
269. Một trong những trường hợp sử dụng cho chức năng này được nêu trong tài liệu

Việc thực tập các chuỗi rất hữu ích để đạt được một chút hiệu suất khi tra cứu từ điển—nếu các khóa trong từ điển được thực tập và khóa tra cứu được thực tập, việc so sánh khóa (sau khi băm) có thể được thực hiện bằng cách so sánh con trỏ thay vì so sánh chuỗi. ()

Các đối tượng được thực tập thường là một nguồn gây nhầm lẫn. Chỉ cần nhớ rằng, nếu bạn còn nghi ngờ, bạn luôn có thể sử dụng

Output:
2037008656
2037008688
63 và
Output:
2037008656
2037008688
64 để xác định đẳng thức đối tượng

Loại bỏ các quảng cáo

Mô phỏng con trỏ trong Python

Chỉ vì con trỏ trong Python không tồn tại tự nhiên không có nghĩa là bạn không thể nhận được lợi ích của việc sử dụng con trỏ. Trên thực tế, có nhiều cách để mô phỏng con trỏ trong Python. Bạn sẽ học được hai trong phần này

  1. Sử dụng các loại có thể thay đổi làm con trỏ
  2. Sử dụng các đối tượng Python tùy chỉnh

Được rồi, chúng ta hãy đi thẳng vào vấn đề

Sử dụng các loại có thể thay đổi làm con trỏ

Bạn đã học về các loại có thể thay đổi. Bởi vì những đối tượng này có thể thay đổi, bạn có thể coi chúng như thể chúng là con trỏ để mô phỏng hành vi của con trỏ. Giả sử bạn muốn sao chép mã c sau

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
52

Mã này lấy một con trỏ tới một số nguyên (

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
272) và sau đó tăng giá trị lên một. Đây là một chức năng chính để thực hiện mã

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
53

Trong đoạn mã trên, bạn gán

Output:
'0x353a208'
'0x3500588'
'0x352f180'
22 cho
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
17, in ra giá trị hiện tại, tăng giá trị lên một rồi in ra giá trị đã sửa đổi. Đầu ra của việc thực thi mã này sẽ như sau

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
54

Một cách để sao chép loại hành vi này trong Python là sử dụng loại có thể thay đổi. Cân nhắc sử dụng danh sách và sửa đổi phần tử đầu tiên

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
55

Ở đây,

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
275 truy cập phần tử đầu tiên và tăng giá trị của nó lên một. Sử dụng
Output:
2037008656
2037008688
60 có nghĩa là kết quả cuối cùng dường như đã sửa đổi giá trị. Vậy con trỏ trong Python có tồn tại không? . Điều này chỉ khả thi vì
Output:
2037008656
2037008688
60 là loại có thể thay đổi. Nếu bạn cố sử dụng
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7, bạn sẽ gặp lỗi

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
56

Đoạn mã trên chứng minh rằng

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7 là bất biến. Do đó, nó không hỗ trợ gán mục.
Output:
2037008656
2037008688
60 không phải là loại có thể thay đổi duy nhất. Một cách phổ biến khác để bắt chước con trỏ trong Python là sử dụng một
Output:
2037008656
2037008688
62

Giả sử bạn có một ứng dụng mà bạn muốn theo dõi mỗi khi một sự kiện thú vị xảy ra. Một cách để đạt được điều này là tạo một

Output:
2037008656
2037008688
62 và sử dụng một trong các mục làm bộ đếm

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
57

Trong ví dụ này, từ điển

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
283 được sử dụng để theo dõi số lần gọi hàm. Sau khi bạn gọi
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
284, bộ đếm đã tăng lên thành
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
285 như mong đợi. Tất cả chỉ vì
Output:
2037008656
2037008688
62 có thể thay đổi

Hãy ghi nhớ, điều này chỉ mô phỏng hành vi của con trỏ và không ánh xạ trực tiếp tới con trỏ thực trong C hoặc C++. Điều đó có nghĩa là, các hoạt động này đắt hơn so với trong C hoặc C++

Loại bỏ các quảng cáo

Sử dụng đối tượng Python

Tùy chọn

Output:
2037008656
2037008688
62 là một cách tuyệt vời để mô phỏng con trỏ trong Python, nhưng đôi khi việc nhớ tên khóa bạn đã sử dụng trở nên tẻ nhạt. Điều này đặc biệt đúng nếu bạn đang sử dụng từ điển trong các phần khác nhau của ứng dụng của mình. Đây là nơi một lớp Python tùy chỉnh thực sự có thể giúp ích

Để xây dựng trên ví dụ cuối cùng, giả sử rằng bạn muốn theo dõi số liệu trong ứng dụng của mình. Tạo một lớp là một cách tuyệt vời để trừu tượng hóa các chi tiết phiền phức

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
58

Mã này định nghĩa một lớp

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
288. Lớp này vẫn sử dụng một
Output:
2037008656
2037008688
62 để giữ dữ liệu thực, nằm trong biến thành viên
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
290. Điều này sẽ cung cấp cho bạn khả năng thay đổi mà bạn cần. Bây giờ bạn chỉ cần có thể truy cập các giá trị này. Một cách hay để làm điều này là với các thuộc tính

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
59

Mã này sử dụng. Nếu bạn không quen thuộc với các công cụ trang trí, bạn có thể xem qua Primer on Python Decorators này. Trình trang trí

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
291 ở đây cho phép bạn truy cập
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
293 và
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
294 như thể chúng là các thuộc tính

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
80

Việc bạn có thể truy cập những tên này dưới dạng thuộc tính có nghĩa là bạn đã trừu tượng hóa thực tế rằng những giá trị này nằm trong một

Output:
2037008656
2037008688
62. Bạn cũng nói rõ hơn tên của các thuộc tính là gì. Tất nhiên, bạn cần có khả năng tăng các giá trị này

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
81

Bạn đã giới thiệu hai phương pháp mới

  1. def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    296
  2. def sum(var1,var2):
        return var1+var2
    print("Address of funtion sum: ",id(sum))
    
    297

Các phương pháp này sửa đổi các giá trị trong số liệu

Output:
2037008656
2037008688
62. Bây giờ bạn có một lớp mà bạn sửa đổi như thể bạn đang sửa đổi một con trỏ

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
82

Tại đây, bạn có thể truy cập ________ 2293 và gọi ________ 2296 ở nhiều vị trí khác nhau trong ứng dụng của mình và mô phỏng con trỏ trong Python. Điều này hữu ích khi bạn có thứ gì đó như số liệu cần được sử dụng và cập nhật thường xuyên trong các phần khác nhau của ứng dụng của bạn

Ghi chú. Đặc biệt, trong lớp này, việc đặt rõ ràng

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
296 và
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
297 thay vì sử dụng
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
503 sẽ ngăn người dùng đặt các giá trị này thành một giá trị
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
3 tùy ý hoặc một giá trị không hợp lệ như
Output:
2037008656
2037008688
62

Đây là nguồn đầy đủ cho lớp

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
288

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
83

Con trỏ thực với >>> s[0] = "R" Traceback (most recent call last): File "", line 1, in TypeError: 'str' object does not support item assignment 1

Được rồi, vậy có thể có con trỏ trong Python, cụ thể là CPython. Sử dụng mô-đun

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
1 dựng sẵn, bạn có thể tạo các con trỏ kiểu C thực trong Python. Nếu bạn không quen thuộc với
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
1, thì bạn có thể xem Mở rộng Python với Thư viện C và Mô-đun “ctypes”

Lý do thực sự bạn sẽ sử dụng điều này là nếu bạn cần thực hiện lệnh gọi hàm tới thư viện C yêu cầu con trỏ. Hãy quay lại hàm

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
510 C trước đó

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
52

Một lần nữa, mã này đang tăng giá trị của

Output:
2037008656
2037008688
67 lên một. Để sử dụng cái này, trước tiên hãy biên dịch nó thành một đối tượng được chia sẻ. Giả sử tệp trên được lưu trữ trong
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
512, bạn có thể thực hiện việc này với
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
513

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
85

Lệnh đầu tiên biên dịch tệp nguồn C thành một đối tượng có tên là

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
514. Lệnh thứ hai lấy tệp đối tượng không được liên kết đó và tạo một đối tượng được chia sẻ có tên là
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
515

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
515 nên có trong thư mục hiện tại của bạn. Bạn có thể tải nó vào Python bằng cách sử dụng
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
1

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
86

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
518 trả về một đối tượng đại diện cho đối tượng dùng chung
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
519. Vì bạn đã định nghĩa
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
510 trong đối tượng dùng chung này nên bạn có thể truy cập nó như thể nó là bất kỳ đối tượng Python nào khác. Tuy nhiên, trước khi gọi hàm, bạn nên chỉ định chữ ký của hàm. Điều này giúp Python đảm bảo rằng bạn chuyển đúng loại cho hàm

Trong trường hợp này, chữ ký hàm là một con trỏ tới một số nguyên.

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
1 sẽ cho phép bạn chỉ định điều này bằng mã sau

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
87

Trong mã này, bạn đang đặt chữ ký hàm khớp với những gì C đang mong đợi. Bây giờ, nếu bạn cố gọi mã này với loại sai, thì bạn sẽ nhận được một cảnh báo thú vị thay vì hành vi không xác định

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
88

Python báo lỗi, giải thích rằng

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
510 muốn có một con trỏ thay vì chỉ một số nguyên. May mắn thay,
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
1 có cách chuyển con trỏ tới các hàm này. Đầu tiên, khai báo một số nguyên kiểu C

>>>

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
89

Đoạn mã trên tạo một số nguyên kiểu C

Output:
2037008656
2037008688
67 với giá trị là
Output:
'0x353a208'
'0x3500588'
'0x352f180'
20.
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
1 cung cấp tiện ích
def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
527 để cho phép chuyển một biến theo tham chiếu

Ghi chú. Thuật ngữ theo tham chiếu trái ngược với việc chuyển một biến theo giá trị

Khi chuyển theo tham chiếu, bạn đang chuyển tham chiếu đến biến ban đầu và do đó, các sửa đổi sẽ được phản ánh trong biến ban đầu. Truyền theo giá trị dẫn đến một bản sao của biến ban đầu và các sửa đổi không được phản ánh trong bản gốc

Để biết thêm thông tin về chuyển qua tham chiếu trong Python, hãy xem Chuyển qua tham chiếu trong Python. Nền tảng và thực tiễn tốt nhất

Bạn có thể sử dụng điều này để gọi

def sum(var1,var2):
    return var1+var2
print("Address of funtion sum: ",id(sum))
510

>>>

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
0

Tốt đẹp. Số nguyên của bạn đã được tăng thêm một. Xin chúc mừng, bạn đã sử dụng thành công con trỏ thực trong Python

Loại bỏ các quảng cáo

Phần kết luận

Bây giờ bạn đã hiểu rõ hơn về giao điểm giữa các đối tượng Python và con trỏ. Mặc dù một số khác biệt giữa tên và biến có vẻ phức tạp, nhưng về cơ bản, việc hiểu các thuật ngữ chính này sẽ mở rộng hiểu biết của bạn về cách Python xử lý các biến

Bạn cũng đã học được một số cách tuyệt vời để mô phỏng con trỏ trong Python

  • Sử dụng các đối tượng có thể thay đổi làm con trỏ chi phí thấp
  • Tạo các đối tượng Python tùy chỉnh để dễ sử dụng
  • Mở khóa con trỏ thực bằng mô-đun
    >>> s[0] = "R"
    Traceback (most recent call last):
      File "", line 1, in 
    TypeError: 'str' object does not support item assignment
    
    1

Các phương thức này cho phép bạn mô phỏng các con trỏ trong Python mà không làm mất đi sự an toàn của bộ nhớ mà Python cung cấp

Cảm ơn vì đã đọc. Nếu bạn vẫn còn thắc mắc, vui lòng liên hệ trong phần nhận xét hoặc trên Twitter

Đánh dấu là đã hoàn thành

Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Con trỏ và đối tượng trong Python

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Địa chỉ bộ nhớ trong Python

Gửi cho tôi thủ thuật Python »

Giới thiệu về Logan Jones

Địa chỉ bộ nhớ trong Python
Địa chỉ bộ nhớ trong Python

Xin chào, tôi là Logan, một cộng tác viên mã nguồn mở, nhà văn cho Real Python, nhà phát triển phần mềm và luôn cố gắng cải thiện. Hãy liên hệ và chúng ta hãy cùng nhau trở nên tốt hơn

» Thông tin thêm về Logan


Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Địa chỉ bộ nhớ trong Python

Aldren

Địa chỉ bộ nhớ trong Python

Brad

Địa chỉ bộ nhớ trong Python

Joanna

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bậc thầy Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

Làm cách nào để lấy dữ liệu từ địa chỉ bộ nhớ trong Python?

Bây giờ chúng ta có địa chỉ, chúng ta có thể lấy lại các đối tượng giá trị/python từ địa chỉ bộ nhớ bằng cách sử dụng mô-đun ctypes . trong đó, memeory_address là địa chỉ bộ nhớ của biến. value là phương thức được sử dụng để trích xuất một giá trị.

Làm cách nào để so sánh địa chỉ bộ nhớ trong Python?

So sánh đẳng thức với Python == và. = . Sử dụng các toán tử đẳng thức == và. = nếu bạn muốn kiểm tra xem hai đối tượng có cùng giá trị hay không, bất kể chúng được lưu trữ ở đâu trong bộ nhớ.

Địa chỉ bộ nhớ trong lập trình là gì?

Địa chỉ bộ nhớ nghĩa là gì? . Địa chỉ nhị phân này được xác định bởi một chuỗi có thứ tự và hữu hạn cho phép CPU theo dõi vị trí của từng byte bộ nhớ. a unique identifier used by a device or CPU for data tracking. This binary address is defined by an ordered and finite sequence allowing the CPU to track the location of each memory byte.

Địa chỉ bộ nhớ là loại gì?

Địa chỉ bộ nhớ được gọi là con trỏ vì bạn có thể coi địa chỉ đó là trỏ đến một vị trí cụ thể trong bộ nhớ. Từ góc độ ngôn ngữ máy, một con trỏ giống như một số nguyên dài (32 bit hoặc 64 bit, tùy thuộc vào loại chương trình thực thi).