Hướng dẫn can we use pointer in python? - chúng ta có thể sử dụng con trỏ trong python không?

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Con trỏ và đồ vật trong Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Pointers and Objects in Python

Show

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ì bạn có thể nghe nói về con trỏ. Con trỏ cho phép bạn tạo ra hiệu quả tuyệt vời trong các phần của mã của bạn. Chúng cũng gây ra sự 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 họ đang ở đâu trong Python, và làm thế 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 giữ địa chỉ bộ nhớ của một biến khác. Đối với việc bồi dưỡng trên các con trỏ, bạn có thể xem xét kiểm tra tổng quan này trên các 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 Python và tìm hiểu lý do tại sao con trỏ trong Python don lồng thực sự tồn tại. Đối với các trường hợp bạn cần bắt chước hành vi con trỏ, bạn sẽ học cách mô phỏng con trỏ trong Python mà không cần cơn ác mộng quản lý bộ nhớ.

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

  • Tìm hiểu lý do tại sao con trỏ trong Python don lồng tồn tại
  • Khám phá sự khác biệt giữa các 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
    >>> s = "real_python"
    >>> id(s)
    140637819584048
    >>> s += "_rocks"
    >>> s
    'real_python_rocks'
    >>> id(s)
    140637819609424
    
    1

Tại sao không có Python 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? Có lẽ, nhưng con trỏ dường như đi ngược lại Zen of Python. Con trỏ khuyến khích những thay đổi ngầm 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à cho người mới bắt đầu. Thậm chí tệ hơn, 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 của bộ nhớ mà bạn không nên làm.

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. 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 don lồng thực sự có ý nghĩa. Mặc dù không sợ hãi, Python, theo mặc định, cung cấp cho bạn một số lợi ích của việc sử dụng con trỏ.

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

  1. Các đối tượng bất biến và có thể thay đổi
  2. Biến/tên Python

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

Đối tượng trong Python

Trong Python, mọi thứ đều là một đối tượng. Để chứng minh, bạn có thể mở ra một bản phát hành và khám phá bằng

>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
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 phần dữ liệu:

  • Số lượng tham chiếu
  • Loại hình
  • Giá trị

Số lượng tham chiếu là để quản lý bộ nhớ. Để có cái nhìn sâu sắc về nội bộ của quản lý bộ nhớ trong Python, bạn có thể đọc quản lý bộ nhớ bằng Python.

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

Không phải tất cả các đối tượng đều giống nhau mặc dù. Có một sự khác biệt quan trọng khác mà bạn sẽ cần phải hiểu: các đối tượng bất biến và 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.

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

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

  1. Các đối tượng bất biến có thể thay đổi. can’t be changed.
  2. Các đối tượng có thể thay đổi có thể được thay đổi. can be changed.

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

Loại hìnhImmutable?
Giá trịSố lượng tham chiếu là để quản lý bộ nhớ. Để có cái nhìn sâu sắc về nội bộ của quản lý bộ nhớ trong Python, bạn có thể đọc quản lý bộ nhớ bằng Python.
Loại được sử dụng ở lớp Cpython để đảm bảo loại an toàn trong thời gian chạy. Cuối cùng, có giá trị, là giá trị thực tế được liên kết với đối tượng.Số lượng tham chiếu là để quản lý bộ nhớ. Để có cái nhìn sâu sắc về nội bộ của quản lý bộ nhớ trong Python, bạn có thể đọc quản lý bộ nhớ bằng Python.
Loại được sử dụng ở lớp Cpython để đảm bảo loại an toàn trong thời gian chạy. Cuối cùng, có giá trị, là giá trị thực tế được liên kết với đối tượng.Số lượng tham chiếu là để quản lý bộ nhớ. Để có cái nhìn sâu sắc về nội bộ của quản lý bộ nhớ trong Python, bạn có thể đọc quản lý bộ nhớ bằng Python.
Loại được sử dụng ở lớp Cpython để đảm bảo loại an toàn trong thời gian chạy. Cuối cùng, có giá trị, là giá trị thực tế được liên kết với đối tượng.Số lượng tham chiếu là để quản lý bộ nhớ. Để có cái nhìn sâu sắc về nội bộ của quản lý bộ nhớ trong Python, bạn có thể đọc quản lý bộ nhớ bằng Python.
Loại được sử dụng ở lớp Cpython để đảm bảo loại an toàn trong thời gian chạy. Cuối cùng, có giá trị, là giá trị thực tế được liên kết với đối tượng.Số lượng tham chiếu là để quản lý bộ nhớ. Để có cái nhìn sâu sắc về nội bộ của quản lý bộ nhớ trong Python, bạn có thể đọc quản lý bộ nhớ bằng Python.
Loại được sử dụng ở lớp Cpython để đảm bảo loại an toàn trong thời gian chạy. Cuối cùng, có giá trị, là giá trị thực tế được liên kết với đối tượng.Số lượng tham chiếu là để quản lý bộ nhớ. Để có cái nhìn sâu sắc về nội bộ của quản lý bộ nhớ trong Python, bạn có thể đọc quản lý bộ nhớ bằng Python.
Loại được sử dụng ở lớp Cpython để đảm bảo loại an toàn trong thời gian chạy. Cuối cùng, có giá trị, là giá trị thực tế được liên kết với đối tượng.Số lượng tham chiếu là để quản lý bộ nhớ. Để có cái nhìn sâu sắc về nội bộ của quản lý bộ nhớ trong Python, bạn có thể đọc quản lý bộ nhớ bằng Python.
Loại được sử dụng ở lớp Cpython để đảm bảo loại an toàn trong thời gian chạy. Cuối cùng, có giá trị, là giá trị thực tế được liên kết với đối tượng.Không phải tất cả các đối tượng đều giống nhau mặc dù. Có một sự khác biệt quan trọng khác mà bạn sẽ cần phải hiểu: các đối tượng bất biến và 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.
Các đối tượng bất biến và có thể thay đổiKhông phải tất cả các đối tượng đều giống nhau mặc dù. Có một sự khác biệt quan trọng khác mà bạn sẽ cần phải hiểu: các đối tượng bất biến và 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.
Các đối tượng bất biến và có thể thay đổiKhông phải tất cả các đối tượng đều giống nhau mặc dù. Có một sự khác biệt quan trọng khác mà bạn sẽ cần phải hiểu: các đối tượng bất biến và 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.

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

  1. Trong Python, có hai loại đối tượng: returns the object’s memory address.
  2. Các đối tượng bất biến có thể thay đổi. returns
    >>> s[0] = "R"
    Traceback (most recent call last):
      File "", line 1, in 
    TypeError: 'str' object does not support item assignment
    
    5 if and only if two objects have the same memory address.

Các đối tượng có thể thay đổi có thể được thay đổi.

>>>

>>> x = 5
>>> id(x)
94529957049376

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 phần dữ liệu:

>>>

>>> x += 1
>>> x
6
>>> id(x)
94529957049408

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 phần dữ liệu:

Số lượng tham chiếu

>>>

>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424

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 phần dữ liệu:

Số lượng tham chiếu

>>>

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

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 phần dữ liệu:

Đối chiếu rằng với một đối tượng có thể thay đổi, như

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

>>>

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368

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

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
6 có ID ban đầu. Ngay cả sau khi
>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
7 được thêm vào danh sách,
>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
6 cũng có cùng ID. Điều này là do loại
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
0 là có thể thay đổi.

Một cách khác để chứng minh rằng danh sách là có thể thay đổi là với nhiệm vụ:

>>>

>>> my_list[0] = 0
>>> my_list
[0, 2, 3, 4]
>>> id(my_list)
140637819575368

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

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
6 có ID ban đầu. Ngay cả sau khi
>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
7 được thêm vào danh sách,
>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
6 cũng có cùng ID. Điều này là do loại
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
0 là có thể thay đổi.

Một cách khác để chứng minh rằng danh sách là có thể thay đổi là với nhiệm vụ:

Trong mã này, bạn đột biến

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
6 và đặt phần tử đầu tiên của nó thành
>>> my_list[0] = 0
>>> my_list
[0, 2, 3, 4]
>>> id(my_list)
140637819575368
1. Tuy nhiên, nó duy trì cùng một ID ngay cả sau nhiệm vụ này. Với các đối tượng có thể thay đổi và bất biến ngoài đường, bước tiếp theo trên hành trình của bạn đến Python Khai sáng là hiểu về hệ sinh thái biến Python.

Hiểu các biến

Các biến Python về cơ bản khác với các biến trong C hoặc C ++. Trên thực tế, Python không có biến số này. Python có tên, không phải biến.

Điều này có vẻ như phạm vi, và phần lớn, nó là. Hầu hết thời gian, nó hoàn toàn chấp nhận được khi nghĩ về các 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 điều hướng chủ đề khó khăn của con trỏ trong Python.

Để giúp lái xe về nhà sự khác biệt, bạn có thể xem cách các biến hoạt động trong C, những gì chúng đại diện, và sau đó tương phản với cách tên hoạt động trong Python.

Các biến trong c

  1. Hãy nói rằng bạn có mã sau xác định biến
    >>> s[0] = "R"
    Traceback (most recent call last):
      File "", line 1, in 
    TypeError: 'str' object does not support item assignment
    
    7:
  2. Một dòng mã này có một số bước khác nhau khi được thực thi:
  3. Phân bổ đủ bộ nhớ cho một số nguyên

Gán giá trị

>>> my_list[0] = 0
>>> my_list
[0, 2, 3, 4]
>>> id(my_list)
140637819575368
3 cho vị trí bộ nhớ đó

Hướng dẫn can we use pointer in python? - chúng ta có thể sử dụng con trỏ trong python không?

Chỉ ra rằng

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7 chỉ vào giá trị đó

Thể hiện trong một chế độ xem đơn giản của bộ nhớ, nó có thể trông như thế này:mutable. The updated memory layout shows the new value:

Hướng dẫn can we use pointer in python? - chúng ta có thể sử dụng con trỏ trong python không?

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

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7 có vị trí bộ nhớ giả là
>>> my_list[0] = 0
>>> my_list
[0, 2, 3, 4]
>>> id(my_list)
140637819575368
6 và giá trị
>>> my_list[0] = 0
>>> my_list
[0, 2, 3, 4]
>>> id(my_list)
140637819575368
3. Nếu sau này trong chương trình, bạn muốn thay đổi giá trị của
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7, bạn có thể thực hiện như sau:

Mã trên gán một giá trị mới (

>>> my_list[0] = 0
>>> my_list
[0, 2, 3, 4]
>>> id(my_list)
140637819575368
9) cho biến
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7, do đó ghi đè lên giá trị trước đó. Điều này có nghĩa là biến
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7 có thể thay đổi. Bố cục bộ nhớ được cập nhật hiển thị giá trị mới:

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

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7 didn thay đổi, chỉ là giá trị. Đây là một điểm quan trọng. Nó có nghĩa là
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7 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 đó,

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7 sở hữu vị trí bộ nhớ.
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7, lúc đầu, là một hộp trống có thể phù hợp với chính xác một số nguyên trong đó các giá trị số nguyên có thể được lưu trữ.

Hướng dẫn can we use pointer in python? - chúng ta có thể sử dụng con trỏ trong python không?

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

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7, bạn sẽ đặt một giá trị trong hộp mà
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7 sở hữu. Nếu bạn muốn giới thiệu một biến mới (
>>> y += 1
>>> y is x
False
8), bạn có thể thêm dòng mã này:

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

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

Hướng dẫn can we use pointer in python? - chúng ta có thể sử dụng con trỏ trong python không?

Lưu ý vị trí mới

>>> x = 1000
>>> y = 1000
>>> x is y
True
1 của
>>> y += 1
>>> y is x
False
8. Mặc dù giá trị của
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7 đã được sao chép lên
>>> y += 1
>>> y is x
False
8, biến
>>> y += 1
>>> y is x
False
8 sở hữu một số địa chỉ mới trong bộ nhớ. Do đó, bạn có thể ghi đè giá trị của
>>> y += 1
>>> y is x
False
8 mà không ảnh hưởng đến
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7:

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

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

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

Tên trong Python

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

  1. Hãy cùng lấy mã tương đương từ ví dụ C ở trên và viết nó bằng Python:
  2. Giống như trong C, mã trên được chia thành một số bước riêng biệt trong quá trình thực thi:
  3. Tạo một
    >>> x = 1000
    >>> y = 499 + 501
    >>> x is y
    False
    
    0
  4. Đặt mã kiểu thành Số nguyên cho
    >>> x = 1000
    >>> y = 499 + 501
    >>> x is y
    False
    
    0
  5. Đặt giá trị thành
    >>> my_list[0] = 0
    >>> my_list
    [0, 2, 3, 4]
    >>> id(my_list)
    140637819575368
    
    3 cho
    >>> x = 1000
    >>> y = 499 + 501
    >>> x is y
    False
    
    0
  6. Tạo một tên gọi là
    >>> s[0] = "R"
    Traceback (most recent call last):
      File "", line 1, in 
    TypeError: 'str' object does not support item assignment
    
    7

Điểm

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7 đến
>>> x = 1000
>>> y = 499 + 501
>>> x is y
False
0 mới

Hướng dẫn can we use pointer in python? - chúng ta có thể sử dụng con trỏ trong python không?

Tăng số tiền của

>>> x = 1000
>>> y = 499 + 501
>>> x is y
False
0 lên 1

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

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

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7 sở hữu khối bộ nhớ trong đó giá trị
>>> my_list[0] = 0
>>> my_list
[0, 2, 3, 4]
>>> id(my_list)
140637819575368
3 cư trú, đối tượng Python mới được tạo sở hữu bộ nhớ nơi
>>> my_list[0] = 0
>>> my_list
[0, 2, 3, 4]
>>> id(my_list)
140637819575368
3 sống. Tên Python
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7 không trực tiếp sở hữu bất kỳ địa chỉ bộ nhớ nào theo cách biến C
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7 sở hữu một khe tĩnh trong bộ nhớ.

Mã này:

  • Tạo ra một
    >>> x = 1000
    >>> y = 499 + 501
    >>> x is y
    False
    
    0 mới
  • Đặt mã kiểu thành Số nguyên cho
    >>> x = 1000
    >>> y = 499 + 501
    >>> x is y
    False
    
    0
  • Đặt giá trị thành
    >>> my_list[0] = 0
    >>> my_list
    [0, 2, 3, 4]
    >>> id(my_list)
    140637819575368
    
    9 cho
    >>> x = 1000
    >>> y = 499 + 501
    >>> x is y
    False
    
    0
  • Điểm
    >>> s[0] = "R"
    Traceback (most recent call last):
      File "", line 1, in 
    TypeError: 'str' object does not support item assignment
    
    7 cho
    >>> x = 1000
    >>> y = 499 + 501
    >>> x is y
    False
    
    0 mới
  • Tăng số tiền của
    >>> x = 1000
    >>> y = 499 + 501
    >>> x is y
    False
    
    0 mới lên 1
  • Giảm số tiền của
    >>> x = 1000
    >>> y = 499 + 501
    >>> x is y
    False
    
    0 cũ xuống 1

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

Hướng dẫn can we use pointer in python? - chúng ta có thể sử dụng con trỏ trong python không?

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

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7 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 cho thấy lệnh
>>> x = 5
>>> id(x)
94529957049376
13 không phải là một nhiệm vụ, mà là ràng buộc tên
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7 với một tham chiếu.

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

>>> my_list[0] = 0
>>> my_list
[0, 2, 3, 4]
>>> id(my_list)
140637819575368
3) hiện đang ngồi trong bộ nhớ với số lượng tham chiếu là 0 và sẽ được dọn dẹp bởi người thu gom rác.

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

>>> y += 1
>>> y is x
False
8, vào hỗn hợp như trong ví dụ C:

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

Hướng dẫn can we use pointer in python? - chúng ta có thể sử dụng con trỏ trong python không?

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ỉ là một tên mới chỉ vào cùng một đối tượng. Ngoài ra, đối tượng REFCOUNT đã tăng thêm một. Bạn có thể kiểm tra công bằng nhận dạng đối tượng để xác nhận rằng chúng giống nhau:

Mã trên chỉ ra rằng

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7 và
>>> y += 1
>>> y is x
False
8 là cùng một đối tượng. Đừng nhầm lẫn mặc dù:
>>> y += 1
>>> y is x
False
8 vẫn còn bất biến.

Ví dụ: bạn có thể thực hiện bổ sung trên

>>> y += 1
>>> y is x
False
8:

>>>

>>> y += 1
>>> y is x
False

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

Hướng dẫn can we use pointer in python? - chúng ta có thể sử dụng con trỏ trong python không?

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

>>> y += 1
>>> y is x
False
8 hiện chỉ vào đối tượng mới. Thật thú vị, đây là cùng một trạng thái kết thúc nếu bạn đã ràng buộc
>>> y += 1
>>> y is x
False
8 với
>>> x = 5
>>> id(x)
94529957049376
23 trực tiếp:

Tuyên bố trên dẫn đến cùng trạng thái bộ nhớ cuối như bổ sung. Để tóm tắt lại, trong Python, bạn không chỉ định các biến. Thay vào đó, bạn liên kết tên với các tài liệu tham khảo.

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

Bây giờ bạn đã hiểu làm thế nào các đối tượng Python được tạo ra và tên bị ràng buộc với các đối tượng đó, đã đến lúc ném một cái cờ lê vào máy móc. Cờ lê đó đi theo tên của các đối tượng thực tập.

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

>>>

>>> x = 1000
>>> y = 1000
>>> x is y
True

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

>>>

>>> x = 1000
>>> y = 499 + 501
>>> x is y
False

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

  1. Một đối tượng mới đã được tạo và
    >>> y += 1
    >>> y is x
    False
    
    8 hiện chỉ vào đối tượng mới. Thật thú vị, đây là cùng một trạng thái kết thúc nếu bạn đã ràng buộc
    >>> y += 1
    >>> y is x
    False
    
    8 với
    >>> x = 5
    >>> id(x)
    94529957049376
    
    23 trực tiếp:
  2. Tuyên bố trên dẫn đến cùng trạng thái bộ nhớ cuối như bổ sung. Để tóm tắt lại, trong Python, bạn không chỉ định các biến. Thay vào đó, bạn liên kết tên với các tài liệu tham khảo.
  3. Một lưu ý về các đối tượng thực tập trong Python
  4. Bây giờ bạn đã hiểu làm thế nào các đối tượng Python được tạo ra và tên bị ràng buộc với các đối tượng đó, đã đến lúc ném một cái cờ lê vào máy móc. Cờ lê đó đi theo tên của các đối tượng thực tập.
  5. Giả sử bạn có mã Python sau:
  6. Như trên,
    >>> s[0] = "R"
    Traceback (most recent call last):
      File "", line 1, in 
    TypeError: 'str' object does not support item assignment
    
    7 và
    >>> y += 1
    >>> y is x
    False
    
    8 đều là những cái tên chỉ vào cùng một đối tượng Python. Nhưng đối tượng Python giữ giá trị
    >>> x = 5
    >>> id(x)
    94529957049376
    
    26 không phải lúc nào cũng được đảm bảo có cùng địa chỉ bộ nhớ. Ví dụ: nếu bạn đã thêm hai số lại với nhau để nhận
    >>> x = 5
    >>> id(x)
    94529957049376
    
    26, bạn sẽ kết thúc với một địa chỉ bộ nhớ khác:
  7. Lần này, dòng
    >>> x = 5
    >>> id(x)
    94529957049376
    
    28 trả về
    >>> x = 5
    >>> id(x)
    94529957049376
    
    29. Nếu điều này là khó hiểu, thì đừng lo lắng. Dưới đây là các bước xảy ra khi mã này được thực thi:

Tạo đối tượng Python (________ 126)

Gán tên

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7 cho đối tượng đó

>>>

>>> x = 5
>>> id(x)
94529957049376
0

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

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

>>> y += 1
>>> y is x
False
8 hiện chỉ vào đối tượng mới. Thật thú vị, đây là cùng một trạng thái kết thúc nếu bạn đã ràng buộc
>>> y += 1
>>> y is x
False
8 với
>>> x = 5
>>> id(x)
94529957049376
23 trực tiếp:

  1. Tuyên bố trên dẫn đến cùng trạng thái bộ nhớ cuối như bổ sung. Để tóm tắt lại, trong Python, bạn không chỉ định các biến. Thay vào đó, bạn liên kết tên với các tài liệu tham khảo.
  2. Một lưu ý về các đối tượng thực tập trong Python

Bây giờ bạn đã hiểu làm thế nào các đối tượng Python được tạo ra và tên bị ràng buộc với các đối tượng đó, đã đến lúc ném một cái cờ lê vào máy móc. Cờ lê đó đi theo tên của các đối tượng thực tập.

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

>>>

>>> x = 5
>>> id(x)
94529957049376
1

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

>>>

>>> x = 5
>>> id(x)
94529957049376
2

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

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

>>> y += 1
>>> y is x
False
8 hiện chỉ vào đối tượng mới. Thật thú vị, đây là cùng một trạng thái kết thúc nếu bạn đã ràng buộc
>>> y += 1
>>> y is x
False
8 với
>>> x = 5
>>> id(x)
94529957049376
23 trực tiếp:

Mô phỏng con trỏ trong Python

Chỉ vì các con trỏ trong Python don lồng tồn tại tự nhiên không có nghĩa là bạn có thể nhận được những lợi ích của việc sử dụng con trỏ. Trong thực tế, có nhiều cách để mô phỏng con trỏ trong Python. Bạn sẽ họ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, hãy để Lừa đi đến điểm.

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ể đối xử với chúng như thể chúng là con trỏ để mô phỏng hành vi con trỏ. Giả sử bạn muốn sao chép mã C sau:

>>> x = 5
>>> id(x)
94529957049376
3

Mã này đưa một con trỏ tới một số nguyên (

>>> x = 5
>>> id(x)
94529957049376
44) 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ã:

>>> x = 5
>>> id(x)
94529957049376
4

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

>>> my_list[0] = 0
>>> my_list
[0, 2, 3, 4]
>>> id(my_list)
140637819575368
3 cho
>>> y += 1
>>> y is x
False
8, in ra giá trị hiện tại, tăng giá trị lên một và sau đó in ra giá trị sửa đổi. Đầu ra của việc thực thi mã này sẽ như sau:

Một cách để tái tạo loại hành vi này trong Python là bằng cách sử dụng một 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:

>>>

>>> x = 5
>>> id(x)
94529957049376
5

Ở đây,

>>> x = 5
>>> id(x)
94529957049376
47 truy cập phần tử đầu tiên và tăng giá trị của nó. Sử dụng
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
0 có nghĩa là kết quả cuối cùng dường như đã sửa đổi giá trị. Vì vậy, gợi ý trong Python có tồn tại? Ồ không. Điều này chỉ có thể vì
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
0 là một loại có thể thay đổi. Nếu bạn đã cố gắng sử dụng
>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
7, bạn sẽ gặp lỗi:

>>>

>>> x = 5
>>> id(x)
94529957049376
6

Ở đây,

>>> x = 5
>>> id(x)
94529957049376
47 truy cập phần tử đầu tiên và tăng giá trị của nó. Sử dụng
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
0 có nghĩa là kết quả cuối cùng dường như đã sửa đổi giá trị. Vì vậy, gợi ý trong Python có tồn tại? Ồ không. Điều này chỉ có thể vì
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
0 là một loại có thể thay đổi. Nếu bạn đã cố gắng sử dụng
>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
7, bạn sẽ gặp lỗi:

Mã trên chứng minh rằng

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

>>>

>>> x = 5
>>> id(x)
94529957049376
7

Ở đây,

>>> x = 5
>>> id(x)
94529957049376
47 truy cập phần tử đầu tiên và tăng giá trị của nó. Sử dụng
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
0 có nghĩa là kết quả cuối cùng dường như đã sửa đổi giá trị. Vì vậy, gợi ý trong Python có tồn tại? Ồ không. Điều này chỉ có thể vì
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
0 là một loại có thể thay đổi. Nếu bạn đã cố gắng sử dụng
>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
7, bạn sẽ gặp lỗi:

Mã trên chứng minh rằng

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

Hãy nói rằng 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 ra >>> s[0] = "R" Traceback (most recent call last): File "", line 1, in TypeError: 'str' object does not support item assignment 2 và sử dụng một trong các mục làm bộ đếm:

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

>>> x = 5
>>> id(x)
94529957049376
55 được sử dụng để theo dõi số lượng các cuộc gọi chức năng. Sau khi bạn gọi
>>> x = 5
>>> id(x)
94529957049376
56, bộ đếm đã tăng lên
>>> x = 5
>>> id(x)
94529957049376
57 như mong đợi. Tất cả vì
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
2 là có thể thay đổi.

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

>>> x = 5
>>> id(x)
94529957049376
8

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

>>> x = 5
>>> id(x)
94529957049376
9

Tùy chọn

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
2 là một cách tuyệt vời để mô phỏng các con trỏ trong Python, nhưng đôi khi thật tẻ nhạt khi nhớ tên khóa bạn đã sử dụng. Điều này đặc biệt đúng nếu bạn sử dụng từ điển trong các phần khác nhau trong ứng dụng của bạn. Đây là nơi một lớp Python tùy chỉnh thực sự có thể giúp đỡ.

>>>

>>> x += 1
>>> x
6
>>> id(x)
94529957049408
0

Ở đây,

>>> x = 5
>>> id(x)
94529957049376
47 truy cập phần tử đầu tiên và tăng giá trị của nó. Sử dụng
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
0 có nghĩa là kết quả cuối cùng dường như đã sửa đổi giá trị. Vì vậy, gợi ý trong Python có tồn tại? Ồ không. Điều này chỉ có thể vì
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
0 là một loại có thể thay đổi. Nếu bạn đã cố gắng sử dụng
>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
7, bạn sẽ gặp lỗi:

>>> x += 1
>>> x
6
>>> id(x)
94529957049408
1

Mã trên chứng minh rằng

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

  1. >>> x = 5
    >>> id(x)
    94529957049376
    
    68
  2. >>> x = 5
    >>> id(x)
    94529957049376
    
    69

Hãy nói rằng 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 ra

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
2 và sử dụng một trong các mục làm bộ đếm:

>>>

>>> x += 1
>>> x
6
>>> id(x)
94529957049408
2

Ở đây,

>>> x = 5
>>> id(x)
94529957049376
47 truy cập phần tử đầu tiên và tăng giá trị của nó. Sử dụng
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
0 có nghĩa là kết quả cuối cùng dường như đã sửa đổi giá trị. Vì vậy, gợi ý trong Python có tồn tại? Ồ không. Điều này chỉ có thể vì
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
0 là một loại có thể thay đổi. Nếu bạn đã cố gắng sử dụng
>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
7, bạn sẽ gặp lỗi:

Mã trên chứng minh rằng

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

>>> x += 1
>>> x
6
>>> id(x)
94529957049408
3

Hãy nói rằng 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 ra >>> s[0] = "R" Traceback (most recent call last): File "", line 1, in TypeError: 'str' object does not support item assignment 2 và sử dụng một trong các mục làm bộ đếm:

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

>>> x = 5
>>> id(x)
94529957049376
55 được sử dụng để theo dõi số lượng các cuộc gọi chức năng. Sau khi bạn gọi
>>> x = 5
>>> id(x)
94529957049376
56, bộ đếm đã tăng lên
>>> x = 5
>>> id(x)
94529957049376
57 như mong đợi. Tất cả vì
>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
2 là có thể thay đổi.

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

>>> x = 5
>>> id(x)
94529957049376
3

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

>>> s[0] = "R"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'str' object does not support item assignment
7. Để sử dụng điều 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
>>> x = 5
>>> id(x)
94529957049376
79, bạn có thể thực hiện điều này với
>>> x = 5
>>> id(x)
94529957049376
80:

>>> x += 1
>>> x
6
>>> id(x)
94529957049408
5

Lệnh đầu tiên biên dịch tệp nguồn C vào một đối tượng gọi là

>>> x = 5
>>> id(x)
94529957049376
81. Lệnh thứ hai lấy tệp đối tượng không liên kết đó và tạo một đối tượng được chia sẻ gọi là
>>> x = 5
>>> id(x)
94529957049376
82.

>>> x = 5
>>> id(x)
94529957049376
82 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
>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
1:

>>>

>>> x += 1
>>> x
6
>>> id(x)
94529957049408
6

>>> x = 5
>>> id(x)
94529957049376
85 trả về một đối tượng đại diện cho đối tượng được chia sẻ
>>> x = 5
>>> id(x)
94529957049376
86. Bởi vì bạn đã xác định
>>> x = 5
>>> id(x)
94529957049376
77 trong đối tượng được chia sẻ này, bạn có thể truy cập nó như thể nó là bất kỳ đối tượng Python nào khác. Trước khi bạn gọi chức năng, bạn nên chỉ định chữ ký chức năng. Điều này giúp Python đảm bảo rằng bạn chuyển đúng loại cho chức năng.

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

>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
1 sẽ cho phép bạn chỉ định điều này bằng cách sử dụng mã sau:

>>>

>>> x += 1
>>> x
6
>>> id(x)
94529957049408
7

>>> x += 1
>>> x
6
>>> id(x)
94529957049408
6

>>>

>>> x += 1
>>> x
6
>>> id(x)
94529957049408
8

>>> x += 1
>>> x
6
>>> id(x)
94529957049408
6

>>>

>>> x += 1
>>> x
6
>>> id(x)
94529957049408
9

>>> x += 1
>>> x
6
>>> id(x)
94529957049408
6

>>> x = 5
>>> id(x)
94529957049376
85 trả về một đối tượng đại diện cho đối tượng được chia sẻ
>>> x = 5
>>> id(x)
94529957049376
86. Bởi vì bạn đã xác định
>>> x = 5
>>> id(x)
94529957049376
77 trong đối tượng được chia sẻ này, bạn có thể truy cập nó như thể nó là bất kỳ đối tượng Python nào khác. Trước khi bạn gọi chức năng, bạn nên chỉ định chữ ký chức năng. Điều này giúp Python đảm bảo rằng bạn chuyển đúng loại cho chức năng.

>>>

>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
0

>>> x += 1
>>> x
6
>>> id(x)
94529957049408
6

Mã >>> x = 5 >>> id(x) 94529957049376 85 trả về một đối tượng đại diện cho đối tượng được chia sẻ >>> x = 5 >>> id(x) 94529957049376 86. Bởi vì bạn đã xác định >>> x = 5 >>> id(x) 94529957049376 77 trong đối tượng được chia sẻ này, bạn có thể truy cập nó như thể nó là bất kỳ đối tượng Python nào khác. Trước khi bạn gọi chức năng, bạn nên chỉ định chữ ký chức năng. Điều này giúp Python đảm bảo rằng bạn chuyển đúng loại cho chức năng.

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

>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
1 sẽ cho phép bạn chỉ định điều này bằng cách sử dụng mã sau:

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

  • Python ném một lỗi, giải thích rằng
    >>> x = 5
    >>> id(x)
    94529957049376
    
    77 muốn một con trỏ thay vì chỉ là một số nguyên. May mắn thay,
    >>> s = "real_python"
    >>> id(s)
    140637819584048
    >>> s += "_rocks"
    >>> s
    'real_python_rocks'
    >>> id(s)
    140637819609424
    
    1 có một cách để chuyển các con trỏ cho các chức năng này. Đầu tiên, khai báo một số nguyên kiểu C:
  • Mã trên tạo ra một số nguyên kiểu C
    >>> s[0] = "R"
    Traceback (most recent call last):
      File "", line 1, in 
    TypeError: 'str' object does not support item assignment
    
    7 với giá trị
    >>> my_list[0] = 0
    >>> my_list
    [0, 2, 3, 4]
    >>> id(my_list)
    140637819575368
    
    1.
    >>> s = "real_python"
    >>> id(s)
    140637819584048
    >>> s += "_rocks"
    >>> s
    'real_python_rocks'
    >>> id(s)
    140637819609424
    
    1 cung cấp tiện dụng
    >>> x = 5
    >>> id(x)
    94529957049376
    
    94 để cho phép truyền một biến bằng cách tham chiếu.
  • Bạn có thể sử dụng cái này để gọi
    >>> x = 5
    >>> id(x)
    94529957049376
    
    77:

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

Sự kết luận

Bây giờ bạn có một sự hiểu biết tốt hơn về giao điểm giữa các đối tượng Python và con trỏ. Mặc dù một số sự khác biệt giữa tên và biến có vẻ như phạm vi, về cơ bản hiểu các thuật ngữ chính này mở rộng sự hiểu biết của bạn về cách Python xử lý các biến. This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Pointers and Objects in Python

Tại sao con trỏ không được hỗ trợ trong Python?

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.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ù không sợ hãi, Python, theo mặc định, cung cấp cho bạn một số lợi ích của việc sử dụng con trỏ.Python often focuses on usability instead of speed. As a result, pointers in Python don't really make sense. Not to fear though, Python does, by default, give you some of the benefits of using pointers.

Một con trỏ trong Python là gì?

Con trỏ về cơ bản là các biến giữ địa chỉ bộ nhớ của một biến khác.Chúng cho phép bạn tạo hiệu quả tuyệt vời trong các phần của mã của bạn nhưng có thể dẫn đến các lỗi quản lý bộ nhớ khác nhau.Bạn sẽ tìm hiểu về mô hình đối tượng của Python và xem tại sao con trỏ trong Python không thực sự tồn tại.variables that hold the memory address of another variable. They allow you to create great efficiency in parts of your code but can lead to various memory management bugs. You'll learn about Python's object model and see why pointers in Python don't really exist.

Tại sao con trỏ không được sử dụng trong Java và Python?

Vì vậy, tổng thể Java không có con trỏ (theo nghĩa C/C ++) bởi vì nó không cần chúng cho chương trình OOP mục đích chung.Hơn nữa, việc thêm các gợi ý vào Java sẽ làm suy yếu sự an toàn và sự mạnh mẽ và làm cho ngôn ngữ trở nên phức tạp hơn.it doesn't need them for general purpose OOP programming. Furthermore, adding pointers to Java would undermine security and robustness and make the language more complex.