Bản thân có phải là một con trỏ trong python không?

Đây là phần thứ hai của loạt bài gồm ba phần đề cập đến các khía cạnh khác nhau của quản lý bộ nhớ Python. Nó bắt đầu cuộc sống như một cuộc nói chuyện hội nghị mà tôi đã thực hiện vào năm 2021, có tiêu đề 'Con trỏ?

Hãy xem Phần 1 của loạt bài này hoặc đọc tiếp phần thảo luận về bình đẳng trong Python và tại sao nó lại phức tạp hơn bạn nghĩ

ID đối tượng và tại sao chúng lại quan trọng

Chúng ta đã kết thúc Phần 1 với câu hỏi sau. làm cách nào để biết khi nào hai đối tượng Python thực sự là cùng một đối tượng trong bộ nhớ?

Vì vậy, làm thế nào để mỗi người trong số họ làm việc?

Bộ so sánh
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
5

Một cách chúng ta có thể hỏi '_____08 và

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
9 có giống nhau không?' bằng Python là viết cái này

>>> a is b

Điều này sẽ trả về cho chúng ta hoặc là

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
0 hoặc là
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
1 Nếu hai đối tượng thực sự là cùng một đối tượng trong bộ nhớ, thì
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
5 sẽ cho chúng ta biết điều đó. Một điều rất hữu ích có thể giúp chúng ta hiểu điều này và để thấy nó hoạt động, là xem xét
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
3 của một đối tượng trong Python

Đối tượng
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
3s

Python có hàm

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
3 tích hợp với các thuộc tính sau

  • >>> c = a.copy[]
    >>> id[a], id[c]
    [139865338256192, 139865337919872]
    6 là một số nguyên
  • >>> c = a.copy[]
    >>> id[a], id[c]
    [139865338256192, 139865337919872]
    7 khi và chỉ khi
    >>> c = a.copy[]
    >>> id[a], id[c]
    [139865338256192, 139865337919872]
    8 và
    >>> c = a.copy[]
    >>> id[a], id[c]
    [139865338256192, 139865337919872]
    9 đề cập đến cùng một đối tượng trong bộ nhớ
  • >>> c = a.copy[]
    >>> id[a], id[c]
    [139865338256192, 139865337919872]
    6 là hằng số trong suốt thời gian tồn tại của
    >>> c = a.copy[]
    >>> id[a], id[c]
    [139865338256192, 139865337919872]
    8 - nghĩa là, miễn là
    >>> c = a.copy[]
    >>> id[a], id[c]
    [139865338256192, 139865337919872]
    8 vẫn còn trong bộ nhớ

Có nhiều cách triển khai Python và trong khi ba điều trên phải đúng với hàm

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
3 trong mỗi cách triển khai, thì không phải tất cả chúng đều thực hiện theo cùng một cách. Một số triển khai, chẳng hạn như CPython [trình thông dịch python được viết bằng C], sử dụng địa chỉ bộ nhớ của đối tượng làm
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
3 của nó - nhưng đừng cho rằng tất cả các triển khai sẽ

Ví dụ: một triển khai Python khác là Skulpt, trình biên dịch Python-to-JavaScript mà Anvil sử dụng để chạy mã máy khách Python trong trình duyệt [để bạn có thể phát triển web mà không cần phải viết JavaScript]. Các đối tượng trong JavaScript không có địa chỉ bộ nhớ ổn định và JavaScript không hiển thị mã định danh ổn định cho mọi đối tượng. Vì vậy, Skulpt không thể sử dụng địa chỉ của đối tượng trong bộ nhớ làm

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
3 của nó

Đối với phần còn lại của bài viết này, chúng tôi sẽ sử dụng các ví dụ được tạo bằng CPython, sử dụng địa chỉ bộ nhớ của đối tượng làm

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
3 của nó. CPython có thể làm điều này bởi vì, khi một đối tượng trong CPython tồn tại, nó không thể được di chuyển trong bộ nhớ. Điều đó có nghĩa là việc sử dụng địa chỉ của một đối tượng làm
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
3 của nó sẽ đảm bảo giá trị ổn định trong suốt thời gian tồn tại của đối tượng đó, không giống như [ví dụ] Skulpt

Vì vậy, hãy xem điều gì sẽ xảy ra khi chúng ta kiểm tra

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
3 của một đối tượng

Dưới đây, chúng tôi xác định một danh sách

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
8 và tạo một con trỏ mới tới nó bằng cách đặt
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
70. Khi chúng tôi kiểm tra các
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
3 của chúng, chúng tôi có thể thấy rằng chúng giống nhau -
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
8 và
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
9 chỉ ra cùng một thứ

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]

Thử điều tương tự với

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
74 cho thấy điều này tạo ra một đối tượng danh sách mới;

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]

Vì vậy, bây giờ chúng ta đã hiểu về

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
3 của một đối tượng trong Python, chúng ta có thể thấy rằng bộ so sánh
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
5 thực sự rất đơn giản

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
5 sử dụng
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
6

Nói

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
12 tương đương trực tiếp với nói
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
13. Khi bạn gọi
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
5 trên hai đối tượng, Python sẽ lấy các
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
3 của chúng và so sánh trực tiếp chúng. Đó là nó

Tuy nhiên, đó không phải là kết thúc của câu chuyện;

Bộ so sánh
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
6

Một cách khác để hỏi '

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
8 và
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
9 có giống nhau không?' bằng Python là viết như sau

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
8

Cũng giống như

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
5, điều này sẽ trả lại cho chúng tôi
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
0 hoặc
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
1. Nhưng cách Python quyết định cái nào sẽ trả về khác với toán tử
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
5 và điều này có nghĩa là
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
6 và
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
5 có thể cho chúng ta các kết quả khác nhau cho cùng một đối tượng

Để thấy điều này trong thực tế, hãy xem xét ví dụ quen thuộc của chúng ta, với

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
8 trỏ đến một danh sách đối tượng danh sách,
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
9 một con trỏ khác tới đối tượng đó và
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
76 một con trỏ tới một bản sao của đối tượng đó

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
7

Với thiết lập này, chúng ta có thể thực hiện các phép so sánh sau và thấy rằng

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
98 là
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
0 trong khi
>>> a is b
10 là
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
1

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
1

Một lần nữa. chuyện gì đang xảy ra ở đây? .

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
5 dùng khi bạn muốn biết liệu hai con trỏ có đang trỏ vào cùng một đối tượng trong bộ nhớ hay không;

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
5 sử dụng
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
6

Câu trả lời là

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
5 và
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
6 được thiết kế để phục vụ hai mục đích khác nhau.
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
5 dùng khi bạn muốn biết liệu hai con trỏ có đang trỏ vào cùng một đối tượng trong bộ nhớ hay không;

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
6 sử dụng
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
53

Khi bạn viết

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
54, thực ra bạn đang gọi một phương thức ma thuật, còn được gọi là phương thức dunder [được đặt tên theo dấu gạch dưới kép ở mỗi bên]. Bạn có thể đã quen thuộc với một số phương pháp ma thuật rồi, chẳng hạn như

  • >>> c = a.copy[]
    >>> id[a], id[c]
    [139865338256192, 139865337919872]
    55, được gọi khi một thể hiện của lớp Python được khởi tạo
  • >>> c = a.copy[]
    >>> id[a], id[c]
    [139865338256192, 139865337919872]
    56, được gọi khi bạn sử dụng hàm
    >>> c = a.copy[]
    >>> id[a], id[c]
    [139865338256192, 139865337919872]
    57 - e. g.
    >>> c = a.copy[]
    >>> id[a], id[c]
    [139865338256192, 139865337919872]
    58
  • >>> c = a.copy[]
    >>> id[a], id[c]
    [139865338256192, 139865337919872]
    59, tương tự như
    >>> c = a.copy[]
    >>> id[a], id[c]
    [139865338256192, 139865337919872]
    56 nhưng cũng được gọi trong các trường hợp khác như thông báo lỗi

Các phương thức ma thuật chỉ đơn giản là các phương thức trên một lớp Python và hai dấu gạch dưới cho biết rằng chúng tương tác với các hàm Python tích hợp. Ví dụ: ghi đè phương thức

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
56 trên một lớp Python sẽ thay đổi cách thức hoạt động của hàm
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
57 nếu bạn gọi nó trên một phiên bản của lớp đã sửa đổi đó

Khi nói đến

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
6 và
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
53, dễ hiểu nhất với một số ví dụ. Hãy cùng xem

Ghi đè phương thức
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
53

Dưới đây, chúng tôi định nghĩa một lớp với phương thức

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
53 của riêng nó. Mọi phương thức
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
53 đều có hai đối số.
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
08 - thể hiện của lớp được đề cập - và đối số thứ hai [trong đoạn mã bên dưới, chúng tôi gọi nó là
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
09] là bất kỳ đối tượng nào mà
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
08 đang được so sánh với

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
9

Vì vậy, nếu chúng ta đánh giá như sau

>>> a is b
1

… thì điều này gọi phương thức

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
53 của MyClass, với
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
8 là tham số
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
08 và chuỗi
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
04 là tham số
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
09. Lưu ý rằng
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
09 không thực sự phải là một đối tượng cùng loại với
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
08. Bạn có thể chọn thực hiện kiểm tra phương pháp
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
53 của mình nếu muốn, nhưng nó không tự động

Trong ví dụ trên,

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
09 sử dụng bộ so sánh
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
5, tương đương với việc so sánh các
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
3 của từng đối tượng. Khi nó xảy ra, đây thực sự là hành vi mặc định cho bất kỳ lớp nào do người dùng định nghĩa trong Python

Vì vậy, điều gì sẽ xảy ra nếu chúng ta xác định một số hành vi không mặc định?

Dưới đây, chúng tôi định nghĩa một lớp nhận đối số

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
12 [sẽ giúp chúng tôi theo dõi các phiên bản của mình trong các ví dụ này] và có một phương thức
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
53 trả về một cách bừa bãi
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
0

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
5

Bởi vì chúng tôi đã ghi đè phương thức

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
53 để luôn trả về
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
0, điều đó có nghĩa là tất cả các phiên bản của lớp này sẽ được coi là bằng nhau dưới bộ so sánh
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
6 - ngay cả khi tên của chúng có các giá trị khác nhau

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
0

Hơn nữa, chúng ta cũng có thể thấy các trường hợp của

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
18 cư xử kỳ lạ khi so sánh với các đối tượng thuộc các loại khác nhau

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
0

Khi so sánh một thể hiện của

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
18 với bất kỳ thứ gì - không chỉ các thể hiện của cùng một lớp - nó sẽ trả về
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
0. Điều này là do, như chúng tôi đã nói trước đó, theo mặc định, phương thức
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
53 không kiểm tra các loại đối tượng được so sánh

Vì vậy, chúng ta có thể làm cho các đối tượng tương đương với bất kỳ thứ gì bằng cách ghi đè

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
53. Chúng ta cũng có thể làm ngược lại

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
1

Bạn có thể nghĩ rằng điều này là hợp lý hơn, nhưng hãy xem xét

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
2

Hơn nữa, vì hành vi của

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
53 phụ thuộc vào đối tượng nào là
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
08 và đối tượng nào là
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
09, nên chúng ta có thể nhận được hành vi sau bằng cách sử dụng một phiên bản của
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
18 và một
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
27

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
3

Điều này là do thứ tự mà chúng tôi so sánh các vấn đề của

>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
28 và
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
29. Khi chúng tôi thực hiện
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
30, chúng tôi đang sử dụng phương thức
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
53 được xác định trong
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
18 -
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
28 là
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
08 và
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
29 là
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
09 và phương thức đó luôn trả về
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
0. Điều ngược lại là đúng khi chúng ta viết
>>> a = ["a", "list"]
>>> id[a]
139865338256192

>>> b = a
>>> id[a], id[b]
[139865338256192, 139865338256192]
38, vì vậy chúng ta nhận được giá trị
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
1 cho biểu thức đó

Tóm tắt. các phương pháp ma thuật là một cách thú vị để khiến Python làm những việc có vẻ rất kỳ lạ và bạn nên tự mày mò với rủi ro

Vậy chúng ta đã học được những gì? . Chúng tôi cũng đã khám phá cách chúng tôi có thể ghi đè

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
53 để xác định ý tưởng tương đương của riêng mình và xem tại sao làm như vậy có thể dẫn đến một số hành vi kỳ lạ

Trước đó, chúng tôi đã đề cập rằng

>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
6 là hằng số và duy nhất 'trong suốt thời gian tồn tại của
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
8', tương đương với câu nói 'miễn là
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
8 vẫn còn trong bộ nhớ'. Điều đó đặt ra câu hỏi. một khi chúng tôi đã tạo một đối tượng
>>> c = a.copy[]
>>> id[a], id[c]
[139865338256192, 139865337919872]
8, làm thế nào và tại sao 'tuổi thọ' của nó kết thúc?

Thông tin thêm về Anvil

Nếu bạn là người mới ở đây, xin chào mừng. Anvil là một nền tảng để xây dựng các ứng dụng web full-stack không có gì ngoài Python. Không cần phải vật lộn với JS, HTML, CSS, Python, SQL và tất cả các framework của chúng – chỉ cần xây dựng tất cả bằng Python

thử cái đe

Tìm hiểu thêm

Bắt đầu với Anvil

Sử dụng trình tạo ứng dụng kéo và thả của chúng tôi để tạo ứng dụng thu thập phản hồi và gửi cho bạn qua email, đồng thời xuất bản trực tuyến trong mười phút hoặc ít hơn.

Không yêu cầu gì ngoài Python.

Đi

Bảy cách để vẽ dữ liệu trong Python

Python là ngôn ngữ của Khoa học dữ liệu và có rất nhiều thư viện vẽ sơ đồ ngoài kia

Bạn nên chọn cái nào?

Trong hướng dẫn này, chúng tôi giới thiệu và giải thích các thư viện vẽ đồ thị Python nổi tiếng nhất, với một bài viết chi tiết về từng thư viện

Đi

Triển khai khoa học dữ liệu lên web với Deepnote

Sử dụng Anvil để xây dựng giao diện người dùng cho sổ ghi chép Deepnote

Đi

Tạo hóa đơn PDF bằng Python

Trong bản dựng ví dụ này, hãy xem cách tạo và tải xuống hóa đơn PDF

Đi

Tạo mẫu nhanh. Xây dựng lịch trình trong 3 giờ

Mất bao lâu để thử nghiệm một startup?

Kiểu dữ liệu nào là self trong Python?

Tham số self là tham chiếu đến phiên bản hiện tại của lớp và được sử dụng để truy cập các biến thuộc về lớp.

Bản thân có được coi là một từ khóa trong Python không?

Việc viết tham số này dưới dạng self chỉ là một quy ước. Đó không phải là từ khóa và không có ý nghĩa đặc biệt trong Python. Chúng tôi có thể sử dụng các tên khác [như thế này] nhưng rất không khuyến khích. Hầu hết các nhà phát triển đều phản đối việc sử dụng các tên khác với tên mình và làm giảm khả năng đọc của mã [Khả năng đọc được tính].

Con trỏ này trong C++ có giống với self trong Python không?

Bản thân trong Python tương đương với con trỏ bản thân trong C++ và tham chiếu this trong Java và C#. Chắc hẳn bạn đang thắc mắc làm thế nào Python đưa ra giá trị cho self và tại sao bạn không cần đưa ra giá trị cho nó. Một ví dụ sẽ làm rõ điều này.

Chủ Đề