Hướng dẫn how do you name a point in python? - làm thế nào để bạn đặt tên một điểm trong python?

Tôi có một bộ sưu tập các điểm mới

>>> x += 1
>>> x
6
>>> id(x)
94529957049408
2 với tọa độ của họ
>>> x += 1
>>> x
6
>>> id(x)
94529957049408
3.

Show

Tôi đang cố gắng đặt cho những điểm này một số tên là

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

Ngoài ra, hãy tạo hai danh sách riêng biệt một chỉ có tên điểm

>>> x += 1
>>> x
6
>>> id(x)
94529957049408
5 và tên còn lại có tên điểm và tọa độ của nó là
>>> x += 1
>>> x
6
>>> id(x)
94529957049408
6

Tôi có mã sau để tạo các điểm ngẫu nhiên.

n = 10
#print(n)

#for k in n:
V = []
V=range(n)
#print("vertices",V)

# Create n random points

random.seed()

pos = {i:(random.randint(0,4000),random.randint(0,5000)) for i in V}
#print("pos =", pos)

points = []
positions = []
for i in pos:
    points.append(pos[i])
    positions.append(i)
    positions.append(pos[i])

Giả sử tôi đang hình thành một danh sách mới

>>> x += 1
>>> x
6
>>> id(x)
94529957049408
7 với hai điểm hiện có
>>> x += 1
>>> x
6
>>> id(x)
94529957049408
8 và ________ 39.THEN,
>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
0

Khi tôi gõ

>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
1 vào bảng điều khiển, nó cung cấp cho tôi,
>>> x += 1
>>> x
6
>>> id(x)
94529957049408
8 và
>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
3 cho tôi tọa độ của nó.

Nhưng xem xét danh sách mới của tôi

>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
4, khi tôi nhập
>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
5 vào bảng điều khiển, nó cung cấp cho tôi tọa độ, nhưng không phải tên của nó.

Tôi cần thêm các điểm này trong

>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
6 vào cùng một danh sách với
>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
7 được xác định ở trên với tọa độ của chúng, nhưng với các tên khác nhau. Có thể ai đó xin vui lòng giúp tôi với điều này?

Tạo các đối tượng Python tùy chỉnh để dễ sử dụng 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

Mở khóa các con trỏ thực bằng mô -đun

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

Các phương pháp này cho phép bạn mô phỏng các con trỏ trong Python mà không hy sinh sự an toàn bộ nhớ mà Python cung cấp.

Cảm ơn vì đã đọc. Nếu bạn vẫn còn thắc mắc, hãy thoải mái tiếp cận trong phần bình luận hoặc trên Twitter.

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

  • Làm thế nào để bạn viết một điểm trong Python?
  • Để tạo một điểm tại vị trí (7, 6) hiện cần ba dòng mã:.
  • p = point () p. x = 7 p. ....
  • Điểm lớp: "" "lớp điểm để đại diện và thao tác với tọa độ x, y." "" ".

>>> p = điểm (4, 2) >>> q = điểm (6, 3) >>> r = point () # r đại diện cho nguồn gốc (0, 0) >>> in (p ..

Có gợi ý 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 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
9:

>>>

>>> 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
    >>> my_list = [1, 2, 3]
    >>> id(my_list)
    140637819575368
    >>> my_list.append(4)
    >>> my_list
    [1, 2, 3, 4]
    >>> id(my_list)
    140637819575368
    
    2 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 "<stdin>", line 1, in <module>
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:

Số lượng tham chiếu

>>>

>>> 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 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

>>>

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

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

  1. Trong Python, có hai loại đối tượng:
  2. Các đối tượng bất biến có thể thay đổi.
  3. Các đối tượng có thể thay đổi có thể được thay đổi.

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:

Hướng dẫn how do you name a point in python? - làm thế nào để bạn đặt tên một điểm trong python?

Ở đây, bạn có thể thấy rằng 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
4 có vị trí bộ nhớ giả là
>>> y += 1
>>> y is x
False
3 và giá trị
>>> y += 1
>>> y is x
False
0. Nếu sau này trong chương trình, bạn muốn thay đổi giá trị của
>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4, bạn có thể thực hiện như sau:

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

>>> y += 1
>>> y is x
False
6) cho 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
4, do đó ghi đè lên giá trị trước đó. Điều này có nghĩa là 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
4 có thể thay đổi. Bố cục bộ nhớ được cập nhật hiển thị giá trị mới:mutable. The updated memory layout shows the new value:

Hướng dẫn how do you name a point in python? - làm thế nào để bạn đặt tên một điểm trong python?

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

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 didn thay đổi, chỉ là giá trị. Đây là một điểm quan trọng. Nó có nghĩa là
>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 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 đó,

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 sở hữu vị trí bộ nhớ.
>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4, 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ữ.

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

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4, bạn sẽ đặt một giá trị trong hộp mà
>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 sở hữu. Nếu bạn muốn giới thiệu một biến mới (
>>> x = 1000
>>> y = 1000
>>> x is y
True
5), 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

>>> x = 1000
>>> y = 1000
>>> x is y
True
5 và sao chép giá trị từ
>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 vào hộp. Bây giờ bố cục bộ nhớ sẽ trông như thế này:

Hướng dẫn how do you name a point in python? - làm thế nào để bạn đặt tên một điểm trong python?

Lưu ý vị trí mới

>>> x = 1000
>>> y = 1000
>>> x is y
True
8 của
>>> x = 1000
>>> y = 1000
>>> x is y
True
5. Mặc dù giá trị của
>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 đã được sao chép lên
>>> x = 1000
>>> y = 1000
>>> x is y
True
5, biến
>>> x = 1000
>>> y = 1000
>>> x is y
True
5 sở hữu một số địa chỉ mới trong bộ nhớ. Do đó, bạn có thể ghi đè giá trị của
>>> x = 1000
>>> y = 1000
>>> x is y
True
5 mà không ảnh hưởng đến
>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4:

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

Hướng dẫn how do you name a point in python? - làm thế nào để bạn đặt tên một điểm trong python?

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

>>> x = 1000
>>> y = 1000
>>> x is y
True
5, 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
>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 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.

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

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:

  1. Tạo một
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    07
  2. Đặt mã đánh máy thành Số nguyên cho
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    07
  3. Đặt giá trị thành
    >>> y += 1
    >>> y is x
    False
    
    0 cho
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    07
  4. Tạo một tên gọi là
    >>> my_list = [1, 2, 3]
    >>> id(my_list)
    140637819575368
    >>> my_list.append(4)
    >>> my_list
    [1, 2, 3, 4]
    >>> id(my_list)
    140637819575368
    
    4
  5. Điểm
    >>> my_list = [1, 2, 3]
    >>> id(my_list)
    140637819575368
    >>> my_list.append(4)
    >>> my_list
    [1, 2, 3, 4]
    >>> id(my_list)
    140637819575368
    
    4 đến
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    07 mới
  6. Tăng số tiền của
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    07 lên 1

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

Hướng dẫn how do you name a point in python? - làm thế nào để bạn đặt tên một điểm trong python?

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ì

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 sở hữu khối bộ nhớ trong đó giá trị
>>> y += 1
>>> y is x
False
0 cư trú, đối tượng Python mới được tạo sở hữu bộ nhớ nơi
>>> y += 1
>>> y is x
False
0 sống. Tên Python
>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 không trực tiếp sở hữu bất kỳ địa chỉ bộ nhớ nào theo cách biến C
>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 sở hữu một khe tĩnh trong bộ nhớ.

Nếu bạn cố gắng gán một giá trị mới cho

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4, bạn có thể thử những điều sau:

Những gì xảy ra ở đây khác với C tương đương, nhưng không quá khác biệt so với liên kết ban đầu trong Python.

Mã này:

  • Tạo ra một
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    07 mới
  • Đặt mã kiểu thành Số nguyên cho
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    07
  • Đặt giá trị thành
    >>> y += 1
    >>> y is x
    False
    
    6 cho
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    07
  • Điểm
    >>> my_list = [1, 2, 3]
    >>> id(my_list)
    140637819575368
    >>> my_list.append(4)
    >>> my_list
    [1, 2, 3, 4]
    >>> id(my_list)
    140637819575368
    
    4 cho
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    07 mới
  • Tăng số tiền của
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    07 mới lên 1
  • Giảm số tiền của
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    07 cũ xuống 1

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

Hướng dẫn how do you name a point in python? - làm thế nào để bạn đặt tên một điểm trong python?

Biểu đồ này giúp minh họa rằng

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 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
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
30 không phải là một nhiệm vụ, mà là ràng buộc tên
>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 với một tham chiếu.

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

>>> y += 1
>>> y is x
False
0) 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,

>>> x = 1000
>>> y = 1000
>>> x is y
True
5, 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 how do you name a point in python? - làm thế nào để bạn đặt tên một điểm 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ỉ 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

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 và
>>> x = 1000
>>> y = 1000
>>> x is y
True
5 là cùng một đối tượng. Đừng nhầm lẫn mặc dù:
>>> x = 1000
>>> y = 1000
>>> x is y
True
5 vẫn còn bất biến.

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

>>> x = 1000
>>> y = 1000
>>> x is y
True
5:

>>>

>>> 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 how do you name a point in python? - làm thế nào để bạn đặt tên một điểm trong python?

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

>>> x = 1000
>>> y = 1000
>>> x is y
True
5 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
>>> x = 1000
>>> y = 1000
>>> x is y
True
5 với
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
40 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

Như trên,

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 và
>>> x = 1000
>>> y = 1000
>>> x is y
True
5 đề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ị
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
43 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
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
43, bạn sẽ kết thúc với một địa chỉ bộ nhớ khác:

>>>

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

Như trên,

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 và
>>> x = 1000
>>> y = 1000
>>> x is y
True
5 đề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ị
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
43 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
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
43, bạn sẽ kết thúc với một địa chỉ bộ nhớ khác:

  1. Lần này, dòng
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    45 trả về
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    46. 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:
  2. Tạo đối tượng Python (________ 143)
  3. Gán tên
    >>> my_list = [1, 2, 3]
    >>> id(my_list)
    140637819575368
    >>> my_list.append(4)
    >>> my_list
    [1, 2, 3, 4]
    >>> id(my_list)
    140637819575368
    
    4 cho đối tượng đó
  4. Tạo đối tượng Python (
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    49)
  5. Tạo đối tượng Python (
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    50)
  6. Thêm hai đối tượng này lại với nhau
  7. Tạo một đối tượng Python mới (
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    43)

Gán tên

>>> x = 1000
>>> y = 1000
>>> x is y
True
5 cho đối tượng đó

Có phải điều này lãng phí? Vâng, đúng vậy, nhưng đó là cái giá mà bạn phải trả cho tất cả những lợi ích tuyệt vời của Python. Bạn không bao giờ phải lo lắng về việc làm sạch các đối tượng trung gian này hoặc thậm chí cần biết rằng chúng tồn tại! Niềm vui là các hoạt động này tương đối nhanh và bạn không bao giờ phải biết bất kỳ chi tiết nào trong số đó cho đến bây giờ.

>>>

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

Như trên,

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 và
>>> x = 1000
>>> y = 1000
>>> x is y
True
5 đề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ị
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
43 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
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
43, bạn sẽ kết thúc với một địa chỉ bộ nhớ khác:

Lần này, dòng

>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
45 trả về
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
46. 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:

  1. Tạo đối tượng Python (________ 143)
  2. Gán tên
    >>> my_list = [1, 2, 3]
    >>> id(my_list)
    140637819575368
    >>> my_list.append(4)
    >>> my_list
    [1, 2, 3, 4]
    >>> id(my_list)
    140637819575368
    
    4 cho đối tượng đó

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

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

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

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

>>>

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

Như trên,

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 và
>>> x = 1000
>>> y = 1000
>>> x is y
True
5 đề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ị
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
43 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
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
43, bạn sẽ kết thúc với một địa chỉ bộ nhớ khác:

>>>

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

Như trên,

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 và
>>> x = 1000
>>> y = 1000
>>> x is y
True
5 đề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ị
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
43 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
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
43, bạn sẽ kết thúc với một địa chỉ bộ nhớ khác:

Lần này, dòng

>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
45 trả về
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
46. 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 (________ 143)

Gán tên

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4 cho đối tượng đó

  1. Tạo đối tượng Python (
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    49)
  2. Tạo đối tượng Python (
    >>> isinstance(1, object)
    True
    >>> isinstance(list(), object)
    True
    >>> isinstance(True, object)
    True
    >>> def foo():
    ...     pass
    ...
    >>> isinstance(foo, object)
    True
    
    50)

Thêm hai đối tượng này lại với nhau

Tạo một đối tượng Python mới (>>> isinstance(1, object) True >>> isinstance(list(), object) True >>> isinstance(True, object) True >>> def foo(): ... pass ... >>> isinstance(foo, object) True 43)

Gán tên

>>> x = 1000
>>> y = 1000
>>> x is y
True
5 cho đối tượng đó

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

Có phải điều này lãng phí? Vâng, đúng vậy, nhưng đó là cái giá mà bạn phải trả cho tất cả những lợi ích tuyệt vời của Python. Bạn không bao giờ phải lo lắng về việc làm sạch các đối tượng trung gian này hoặc thậm chí cần biết rằng chúng tồn tại! Niềm vui là các hoạt động này tương đối nhanh và bạn không bao giờ phải biết bất kỳ chi tiết nào trong số đó cho đến bây giờ.

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

Các nhà phát triển Python cốt lõi, trong sự khôn ngoan của họ, cũng nhận thấy chất thải này và quyết định thực hiện một vài 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 đến:

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

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
2. Đây là kết quả của các đối tượng thực tập. Python tạo trước một tập hợp con của các đối tượng trong bộ nhớ và giữ chúng trong không gian tên toàn cầu để sử dụng hàng ngày.

>>>

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

Đối tượng nào phụ thuộc vào việc thực hiện Python. CPYThon 3.7 thực tập viên sau:

>>>

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

Số nguyên từ

>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
54 và
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
55

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 một

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

>>>

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

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

>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
72 đượ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
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
73, bộ đếm đã tăng lên
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
74 như mong đợi. Tất cả vì
>>> s[0] = "R"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
9 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 ++.

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

Tùy chọn

>>> s[0] = "R"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
9 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ây dựng trên ví dụ cuối cùng, giả sử rằng bạn muốn theo dõi các 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 các chi tiết phiền phức:

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

Mã này xác định một lớp

>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
77. Lớp này vẫn sử dụng
>>> s[0] = "R"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
9 để giữ dữ liệu thực tế, nằm trong biến thành viên
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
79. Điều này sẽ cung cấp cho bạn khả năng đột biến mà bạn cần. Bây giờ bạn chỉ cần có khả năng 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:

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

Mã này sử dụng

>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
80. Nếu bạn không quen thuộc với các nhà trang trí, bạn có thể kiểm tra mồi này trên các nhà trang trí Python. Bộ trang trí
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
80 ở đây cho phép bạn truy cập
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
82 và
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
83 như thể chúng là thuộc tính:

>>>

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

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

>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
72 đượ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
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
73, bộ đếm đã tăng lên
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
74 như mong đợi. Tất cả vì
>>> s[0] = "R"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
9 là có thể thay đổi.

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

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 ++.

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

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

>>>

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

Tùy chọn

>>> s[0] = "R"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
9 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ây dựng trên ví dụ cuối cùng, giả sử rằng bạn muốn theo dõi các 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 các chi tiết phiền phức:

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

Mã này xác định một lớp >>> isinstance(1, object) True >>> isinstance(list(), object) True >>> isinstance(True, object) True >>> def foo(): ... pass ... >>> isinstance(foo, object) True 77. Lớp này vẫn sử dụng >>> s[0] = "R" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment 9 để giữ dữ liệu thực tế, nằm trong biến thành viên >>> isinstance(1, object) True >>> isinstance(list(), object) True >>> isinstance(True, object) True >>> def foo(): ... pass ... >>> isinstance(foo, object) True 79. Điều này sẽ cung cấp cho bạn khả năng đột biến mà bạn cần. Bây giờ bạn chỉ cần có khả năng 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:

Mã này sử dụng

>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
80. Nếu bạn không quen thuộc với các nhà trang trí, bạn có thể kiểm tra mồi này trên các nhà trang trí Python. Bộ trang trí
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
80 ở đây cho phép bạn truy cập
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
82 và
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
83 như thể chúng là thuộc tính:

Thực tế là bạn có thể truy cập các 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ế là các giá trị này nằm trong một

>>> s[0] = "R"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
9. Bạn cũng làm cho nó rõ ràng 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:

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

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

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

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

>>> s[0] = "R"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
9. 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ỏ:

Tại đây, bạn có thể truy cập

>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
82 và gọi
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
85 ở nhiều nơi khác nhau trong các ứng dụng của bạn và mô phỏng các con trỏ trong Python. Điều này rất hữu ích khi bạn có một cái gì đó giống như các 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 trong các ứng dụng của bạn.

>>>

Tại đây, nguồn đầy đủ cho lớp
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
77:

Con trỏ thực sự với

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

Được rồi, vì vậy có lẽ có những gợi ý trong Python, cụ thể là Cpython. Sử dụng mô-đun

>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
8 tích hợp, bạn có thể tạo các con trỏ kiểu C thực sự trong Python. Nếu bạn không quen thuộc với
>>> s = "real_python"
>>> id(s)
140637819584048
>>> s += "_rocks"
>>> s
'real_python_rocks'
>>> id(s)
140637819609424
8, thì bạn có thể xem phần mở rộng Python với các thư viện C và mô -đun CTYPES.

>>>

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

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 cuộc gọi chức năng đến thư viện C yêu cầu một con trỏ. Hãy cùng quay trở lại chức năng

>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
94 C từ trước:

>>>

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

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

>>> my_list = [1, 2, 3]
>>> id(my_list)
140637819575368
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140637819575368
4. Để 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
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
96, bạn có thể thực hiện điều này với
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
97:

>>>

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

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

>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
98. 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à
>>> isinstance(1, object)
True
>>> isinstance(list(), object)
True
>>> isinstance(True, object)
True
>>> def foo():
...     pass
...
>>> isinstance(foo, object)
True
99.

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

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

>>>

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

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.

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 vật thể có thể thay đổi làm con trỏ thấp
  • Tạo các đối tượng Python tùy chỉnh để dễ sử dụng
  • Mở khóa các con trỏ thực bằng mô -đun
    >>> s = "real_python"
    >>> id(s)
    140637819584048
    >>> s += "_rocks"
    >>> s
    'real_python_rocks'
    >>> id(s)
    140637819609424
    
    8

Các phương pháp này cho phép bạn mô phỏng các con trỏ trong Python mà không hy sinh sự an toàn bộ nhớ mà Python cung cấp.

Cảm ơn vì đã đọc. Nếu bạn vẫn còn thắc mắc, hãy thoải mái tiếp cận trong phần bình luận hoặc trên Twitter.

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

Làm thế nào để bạn viết một điểm trong Python?

Để tạo một điểm tại vị trí (7, 6) hiện cần ba dòng mã:..
p = point () p. x = 7 p. ....
Điểm lớp: "" "lớp điểm để đại diện và thao tác với tọa độ x, y." "" ".
>>> p = điểm (4, 2) >>> q = điểm (6, 3) >>> r = point () # r đại diện cho nguồn gốc (0, 0) >>> in (p ..

Có gợi ý trong Python?

Không, chúng tôi không có bất kỳ loại con trỏ nào trong ngôn ngữ Python.Các đối tượng được truyền đến chức năng bằng cách tham chiếu.Cơ chế được sử dụng trong Python giống hệt như chuyển các con trỏ theo giá trị trong C. Chúng ta có các biến Python không phải là một con trỏ.. The objects are passed to function by reference. The mechanism used in Python is exactly like passing pointers by the value in C. We have Python variables which is not a pointer.

Làm thế nào để bạn tìm thấy tọa độ của một điểm trong Python?

Khoa học dữ liệu thực tế sử dụng Python..
Đặt kích thước hình và điều chỉnh phần đệm giữa và xung quanh các ô phụ ..
Tạo danh sách các điểm dữ liệu x và y ..
Vẽ các điểm dữ liệu X và Y với màu đỏ và điểm đánh dấu được đóng vai chính ..
Đặt một số thuộc tính trục ..
Lặp lại X và Y để hiển thị các tọa độ trên cốt truyện ..

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

Con trỏ có xu hướng tạo ra sự phức tạp trong mã, trong đó Python chủ yếu tập trung vào khả năng sử dụng hơn là tốc độ.Do đó, Python không hỗ trợ con trỏ.Tuy nhiên, Python mang lại một số lợi ích của việc sử dụng con trỏ.Trước khi hiểu con trỏ trong Python, chúng ta cần có ý tưởng cơ bản về các điểm sau.