Hướng dẫn how do you find the reference variable in python? - làm thế nào để bạn tìm thấy biến tham chiếu trong python?

Đối số được thông qua bằng cách chuyển nhượng. Lý do đằng sau điều này là gấp đôi:

  1. Tham số được truyền vào thực sự là một tham chiếu đến một đối tượng (nhưng tham chiếu được truyền theo giá trị)
  2. Một số loại dữ liệu có thể thay đổi, nhưng những loại khác thì không

So:

  • Nếu bạn chuyển một đối tượng có thể thay đổi vào một phương thức, phương thức sẽ có một tham chiếu đến cùng một đối tượng và bạn có thể biến nó theo niềm vui của trái tim bạn, nhưng nếu bạn viết lại tham chiếu trong phương thức, phạm vi bên ngoài sẽ không biết gì về nó và sau đó Bạn đã hoàn tất, tham chiếu bên ngoài vẫn sẽ chỉ vào đối tượng ban đầu.

  • Nếu bạn chuyển một đối tượng bất biến cho một phương thức, bạn vẫn không thể viết lại tham chiếu bên ngoài và bạn thậm chí không thể làm biến đổi đối tượng.

Để làm cho nó rõ ràng hơn, hãy có một số ví dụ.

Danh sách - một loại có thể thay đổi

Chúng ta hãy cố gắng sửa đổi danh sách đã được chuyển cho một phương thức:

def try_to_change_list_contents(the_list):
    print('got', the_list)
    the_list.append('four')
    print('changed to', the_list)

outer_list = ['one', 'two', 'three']

print('before, outer_list =', outer_list)
try_to_change_list_contents(outer_list)
print('after, outer_list =', outer_list)

Output:

before, outer_list = ['one', 'two', 'three']
got ['one', 'two', 'three']
changed to ['one', 'two', 'three', 'four']
after, outer_list = ['one', 'two', 'three', 'four']

Vì tham số được truyền vào là một tham chiếu đến outer_list, không phải là bản sao của nó, chúng ta có thể sử dụng các phương thức danh sách đột biến để thay đổi nó và có các thay đổi được phản ánh trong phạm vi bên ngoài.

Bây giờ chúng ta hãy xem những gì xảy ra khi chúng ta cố gắng thay đổi tham chiếu được truyền dưới dạng tham số:

def try_to_change_list_reference(the_list):
    print('got', the_list)
    the_list = ['and', 'we', 'can', 'not', 'lie']
    print('set to', the_list)

outer_list = ['we', 'like', 'proper', 'English']

print('before, outer_list =', outer_list)
try_to_change_list_reference(outer_list)
print('after, outer_list =', outer_list)

Output:

before, outer_list = ['we', 'like', 'proper', 'English']
got ['we', 'like', 'proper', 'English']
set to ['and', 'we', 'can', 'not', 'lie']
after, outer_list = ['we', 'like', 'proper', 'English']

Vì tham số the_list được truyền bởi giá trị, việc gán một danh sách mới cho nó không có tác dụng mà mã bên ngoài phương thức có thể thấy. the_list là một bản sao của tài liệu tham khảo outer_list và chúng tôi đã có the_list chỉ vào một danh sách mới, nhưng không có cách nào để thay đổi khi outer_list chỉ ra.

Chuỗi - một loại bất biến

Nó là bất biến, vì vậy chúng ta không thể làm gì để thay đổi nội dung của chuỗi

Bây giờ, chúng ta hãy cố gắng thay đổi tham chiếu

def try_to_change_string_reference(the_string):
    print('got', the_string)
    the_string = 'In a kingdom by the sea'
    print('set to', the_string)

outer_string = 'It was many and many a year ago'

print('before, outer_string =', outer_string)
try_to_change_string_reference(outer_string)
print('after, outer_string =', outer_string)

Đầu ra:

before, outer_string = It was many and many a year ago
got It was many and many a year ago
set to In a kingdom by the sea
after, outer_string = It was many and many a year ago

Một lần nữa, vì tham số

before, outer_list = ['one', 'two', 'three']
got ['one', 'two', 'three']
changed to ['one', 'two', 'three', 'four']
after, outer_list = ['one', 'two', 'three', 'four']
4 được truyền theo giá trị, việc gán một chuỗi mới cho nó không có tác dụng mà mã bên ngoài phương thức có thể thấy.
before, outer_list = ['one', 'two', 'three']
got ['one', 'two', 'three']
changed to ['one', 'two', 'three', 'four']
after, outer_list = ['one', 'two', 'three', 'four']
4 là một bản sao của tài liệu tham khảo
before, outer_list = ['one', 'two', 'three']
got ['one', 'two', 'three']
changed to ['one', 'two', 'three', 'four']
after, outer_list = ['one', 'two', 'three', 'four']
6 và chúng tôi đã có
before, outer_list = ['one', 'two', 'three']
got ['one', 'two', 'three']
changed to ['one', 'two', 'three', 'four']
after, outer_list = ['one', 'two', 'three', 'four']
4 chỉ vào một chuỗi mới, nhưng không có cách nào để thay đổi khi
before, outer_list = ['one', 'two', 'three']
got ['one', 'two', 'three']
changed to ['one', 'two', 'three', 'four']
after, outer_list = ['one', 'two', 'three', 'four']
6 chỉ.

Tôi hy vọng điều này làm rõ mọi thứ một chút.

EDIT: Đã lưu ý rằng điều này không trả lời câu hỏi mà @David ban đầu hỏi, "Có điều gì tôi có thể làm để truyền biến bằng cách tham khảo thực tế không?". Hãy làm việc đó. It's been noted that this doesn't answer the question that @David originally asked, "Is there something I can do to pass the variable by actual reference?". Let's work on that.

Làm thế nào để chúng ta có được xung quanh điều này?

Như câu trả lời của @Andrea cho thấy, bạn có thể trả về giá trị mới. Điều này không thay đổi cách mọi thứ được truyền vào, nhưng cho phép bạn lấy thông tin bạn muốn trở lại:

def return_a_whole_new_string(the_string):
    new_string = something_to_do_with_the_old_string(the_string)
    return new_string

# then you could call it like
my_string = return_a_whole_new_string(my_string)

Nếu bạn thực sự muốn tránh sử dụng giá trị trả về, bạn có thể tạo một lớp để giữ giá trị của mình và chuyển nó vào hàm hoặc sử dụng một lớp hiện có, như một danh sách:

def use_a_wrapper_to_simulate_pass_by_reference(stuff_to_change):
    new_string = something_to_do_with_the_old_string(stuff_to_change[0])
    stuff_to_change[0] = new_string

# then you could call it like
wrapper = [my_string]
use_a_wrapper_to_simulate_pass_by_reference(wrapper)

do_something_with(wrapper[0])

Mặc dù điều này có vẻ hơi cồng kềnh.

Biến tham chiếu trong ví dụ Python là gì?

Khi một biến được gán một giá trị trong Python, biến không lưu trữ giá trị tuyệt đối trực tiếp. Thay vào đó, Python tạo ra một tham chiếu mới cho một đối tượng đại diện cho giá trị đó. Ví dụ: dòng a = 1 gán giá trị 1 cho biến a.the line a = 1 assigns the value 1 to the variable a .

Giá trị tham chiếu trong Python là gì?

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.Call by Object Reference” or “Call by assignment”. 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.

Làm thế nào để bạn tham khảo một biến?

Khi một biến được khai báo là một tham chiếu, nó trở thành một tên thay thế cho một biến hiện có.Một biến có thể được khai báo là một tài liệu tham khảo bằng cách đặt '&' trong tuyên bố.by putting '&' in the declaration.

Biến tham chiếu trong OOPS trong Python là gì?

Một biến tham chiếu là một biến trỏ đến một đối tượng của một lớp nhất định, cho phép bạn truy cập giá trị của một đối tượng.Một đối tượng là một cấu trúc dữ liệu ghép chứa các giá trị mà bạn có thể thao tác.Một biến tham chiếu không lưu trữ các giá trị riêng của nó.a variable that points to an object of a given class, letting you access the value of an object. An object is a compound data structure that holds values that you can manipulate. A reference variable does not store its own values.