Hướng dẫn does python store by reference or value? - python có lưu trữ theo tham chiếu hoặc giá trị không?

Là Python Pass-By-Reference hay Pass-By-Agents?

09 tháng 2 năm 2014

Giả sử tôi nói với chất béo, hoặc Kevin nói với béo, bạn không trải nghiệm Chúa. Bạn chỉ đơn thuần trải nghiệm điều gì đó với những phẩm chất và khía cạnh, bản chất và sức mạnh và sự khôn ngoan và lòng tốt của Chúa. Điều này giống như trò đùa về tuyên bố của Đức đối với sự trừu tượng kép; Một cơ quan của Đức về văn học Anh tuyên bố, Ham Hamlet không được viết bởi Shakespeare; Nó chỉ được viết bởi một người đàn ông tên là Shakespeare. Trong tiếng Anh, sự khác biệt là bằng lời nói và không có ý nghĩa, mặc dù tiếng Đức là ngôn ngữ sẽ thể hiện sự khác biệt [chiếm một số tính năng kỳ lạ của tâm trí Đức].

Valis, p71 [Phiên bản Creb-of-the-Tháng]

Philip K. Dick không được biết đến với văn xuôi ánh sáng hoặc tiêu hóa. Đại đa số các nhân vật của anh ấy rất cao. Giống như, thực sự, thực sự, thực sự cao. Tuy nhiên, trong câu trích dẫn trên từ Valis [xuất bản năm 1981], ông đưa ra một lời giải thích có tầm nhìn đáng kể về mô hình Python bị hiểu lầm khét tiếng. Cộng với sự thay đổi ça, cộng với các loại thuốc Omnomnomnom nhất.

Hai cách tiếp cận được biết đến rộng rãi và dễ hiểu nhất đối với tham số truyền qua các ngôn ngữ lập trình là từng tham chiếu và vượt qua. Thật không may, Python là người tham khảo theo từng đối tượng, trong đó thường được nói:

Tài liệu tham khảo đối tượng được truyền qua giá trị.

Khi tôi lần đầu tiên đọc định nghĩa tự mãn và quá thích, tôi muốn đấm một cái gì đó. Sau khi loại bỏ các mảnh vỡ thủy tinh ra khỏi tay tôi và được hộ tống ra khỏi Câu lạc bộ thoát y, tôi nhận ra rằng cả 3 mô hình có thể được hiểu theo cách chúng khiến 2 chức năng sau đây hoạt động:

def reassign[list]:
  list = [0, 1]

def append[list]:
  list.append[1]

list = [0]
reassign[list]
append[list]

Hãy để khám phá.

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

Ham Hamlet không được viết bởi Shakespeare; Nó chỉ được viết bởi một người đàn ông tên là Shakespeare. Cả Python và PKD đều có sự khác biệt quan trọng giữa một thứ và nhãn chúng tôi sử dụng để chỉ điều đó. Người đàn ông tên là Shakespeare là một người đàn ông. Cấm Shakespeare chỉ là một cái tên. Nếu chúng ta làm:

a = []

Sau đó [] là danh sách trống. a là một biến chỉ vào danh sách trống, nhưng bản thân a không phải là danh sách trống. Tôi vẽ và thường xuyên gọi các biến là các hộp của các hộp có chứa các đối tượng; Nhưng tuy nhiên bạn quan niệm về nó, sự khác biệt này là chìa khóa.

Pass-by-reference

Trong từng tham chiếu, hộp [biến] được chuyển trực tiếp vào hàm và nội dung của nó [đối tượng được biểu thị bởi biến] hoàn toàn đi kèm với nó. Bên trong bối cảnh chức năng, đối số về cơ bản là một bí danh hoàn chỉnh cho biến được truyền bởi người gọi. Chúng là cả hai cùng một hộp, và do đó cũng đề cập đến cùng một đối tượng trong bộ nhớ.

Do đó, bất cứ điều gì chức năng làm cho biến hoặc đối tượng mà nó biểu thị sẽ được hiển thị cho người gọi. Ví dụ, chức năng có thể thay đổi hoàn toàn nội dung biến và trỏ nó vào một đối tượng hoàn toàn khác:

Hàm cũng có thể thao tác đối tượng mà không cần chỉ định lại nó, với cùng một hiệu ứng:

Để nhắc lại, trong các tham chiếu qua, chức năng và người gọi đều sử dụng cùng một biến và đối tượng.

Pass-by-value

Trong từng giá trị, hàm nhận được một bản sao của các đối tượng đối số được truyền bởi người gọi, được lưu trữ ở một vị trí mới trong bộ nhớ.

Hàm sau đó cung cấp hiệu quả hộp riêng của nó để đặt giá trị vào và không còn bất kỳ mối quan hệ nào giữa các biến hoặc các đối tượng được gọi bởi hàm và người gọi. Các đối tượng tình cờ có cùng một giá trị, nhưng chúng hoàn toàn tách biệt và không có gì xảy ra với người này sẽ ảnh hưởng đến người kia. Nếu chúng ta lại cố gắng chỉ định lại:

Bên ngoài chức năng, không có gì xảy ra. Tương tự:

Các bản sao của các biến và đối tượng trong bối cảnh của người gọi được cách ly hoàn toàn.

Pass-by-object-reference

Python là khác nhau. Như chúng ta đã biết, trong Python, các tài liệu tham khảo đối tượng của người Viking được truyền qua giá trị.

Một hàm nhận được tham chiếu đến [và sẽ truy cập] cùng một đối tượng trong bộ nhớ như được người gọi sử dụng. Tuy nhiên, nó không nhận được hộp mà người gọi đang lưu trữ đối tượng này; Như trong từng giá trị, hàm cung cấp hộp riêng và tạo một biến mới cho chính nó. Hãy thử nối lại lần nữa:

Cả hàm và người gọi đều đề cập đến cùng một đối tượng trong bộ nhớ, vì vậy khi hàm nối thêm một mục bổ sung vào danh sách, chúng ta cũng thấy điều này trong trình gọi! Họ tên khác nhau cho cùng một điều; Các hộp khác nhau chứa cùng một đối tượng. Đây là những gì có nghĩa bằng cách truyền các tham chiếu đối tượng theo giá trị - hàm và người gọi sử dụng cùng một đối tượng trong bộ nhớ, nhưng được truy cập thông qua các biến khác nhau. Điều này có nghĩa là cùng một đối tượng đang được lưu trữ trong nhiều hộp khác nhau và loại ẩn dụ bị phá vỡ. Giả vờ nó lượng tử hay gì đó.

Nhưng điều quan trọng là chúng thực sự là những cái tên khác nhau và các hộp khác nhau. Trong từng tham chiếu, về cơ bản chúng là cùng một hộp. Khi bạn cố gắng gán lại một biến và đặt một cái gì đó khác biệt vào hộp chức năng, bạn cũng đặt nó vào hộp người gọi, vì chúng là cùng một hộp. Nhưng, trong tham chiếu qua từng đối tượng:

Người gọi không quan tâm nếu bạn phân công lại hộp chức năng. Các hộp khác nhau, cùng một nội dung.

Bây giờ chúng ta thấy những gì Philip K. Dick đã cố gắng nói với chúng ta. Một cái tên và một người là những thứ khác nhau. Một biến và một đối tượng là những thứ khác nhau. Được trang bị kiến ​​thức này, có lẽ bạn có thể bắt đầu suy luận những gì xảy ra khi bạn làm những việc như

listA = [0]
listB = listA
listB.append[1]
print listA

Bạn cũng có thể muốn đọc về các tương tác thú vị mà các khái niệm này có với các loại có thể thay đổi và bất biến. Nhưng đó là những câu chuyện cho một ngày khác. Bây giờ nếu bạn tha thứ cho tôi, tôi sẽ đọc sách DO DO ANDROIDS DREAM of Electric Sheep? - Bản trình diễn meta của tôi là một chút gỉ.

Liên kết hữu ích

//foobarnbaz.com/2012/07/08/undermed-python-variables/ //javadude.com/articles/passbyvalue.htm

Python có gán bằng cách tham khảo không?

Python sử dụng một hệ thống, được gọi là Call Call by the Object tham khảo đối tượng hoặc cuộc gọi của người khác. Trong trường hợp bạn chuyển các đối số như toàn bộ số, chuỗi hoặc bộ dữ liệu cho một hàm, việc vượt qua giống như giá trị cuộc gọi vì bạn không thể thay đổi giá trị của các đối tượng bất biến được truyền đến hàm.. In the event that you pass arguments like whole numbers, strings or tuples to a function, the passing is like call-by-value because you can not change the value of the immutable objects being passed to the function.

Các chuỗi trong Python được truyền qua tham chiếu hoặc giá trị?

Cách xử lý pythonic với điều này là giữ các chuỗi trong một danh sách và tham gia cùng nhau khi bạn có tất cả các mảnh. Python không bao giờ vượt qua bằng cách tham khảo. Nó vượt qua các tài liệu tham khảo, nhưng "vượt qua tham chiếu" đã được thực hiện cho một kiểu đi qua đối số khác [ví dụ, một loại cho phép hoán đổi chức năng [a, b]].Python never passes by reference. It passes references, but "pass by reference" is already taken for another argument passing style [one which permits, for example, the function swap[a, b] ].

Từ điển Python có được truyền qua tham khảo không?

Về bản chất, người ta có thể nói rằng các đối tượng có thể thay đổi như từ điển, bộ và danh sách được truyền qua tham chiếu.Các đối tượng bất biến như int, str, tuple được truyền bởi giá trị.mutable objects like dictionaries, sets, and lists are passed by reference. Immutable objects like int , str , tuple are passed by value.

Python có phải là loại tham chiếu không?

Tất cả các giá trị trong Python là tài liệu tham khảo.Điều bạn cần phải lo lắng là nếu một loại có thể thay đổi.Các loại số và chuỗi cơ bản, cũng như tuple và frozenset là bất biến;Các tên bị ràng buộc với một đối tượng của một trong những loại đó chỉ có thể được bật lại, không bị đột biến.. What you need to worry about is if a type is mutable. The basic numeric and string types, as well as tuple and frozenset are immutable; names that are bound to an object of one of those types can only be rebound, not mutated.

Bài Viết Liên Quan

Chủ Đề