Hướng dẫn python copy variable value not reference - python copy giá trị biến không phải là tham chiếu

Khá mới với Python và đấu tranh để đạt được một bản sao giá trị của một biến. Có một thuật toán gọi đệ quy một cách khác nhưng không nhận được các giá trị mong muốn vì tôi nghĩ rằng tôi thay vì sử dụng tham chiếu khi gán một biến cho một biến khác trong mã sau:

def search(problem, strategy, depthl, depthi, pruning):
    depthact = depthi
    sol = None
    while(not sol and depthact <= depthl):
        sol = limSearch(problem, strategy, depthact, pruning)
        depthact += depthi
    return sol

Tôi muốn có độ sâu có giá trị tương tự như độ sâu nhưng thay vào đó tôi nghĩ rằng tôi chỉ vào cùng một vị trí bộ nhớ và do đó khi gọi Limsearch, tôi đang thực hiện nó với bất kỳ giá trị nào Muốn sử dụng kể từ khi tôi tăng nó.depthact the same value as depthi but instead i think im pointing to the same memory location and therefore when calling limSearch im doing it with whatever value is passed to the method in depthi instead of the other one that is the one i wanna use since i then increment it.

Tôi có đúng không? Bất kỳ trợ giúp sẽ được đánh giá cao.

EDIT: Tôi biết giải pháp cho thuật toán Limsearch đang ở độ sâu = 35 nhưng muốn thuật toán khác này kiểm tra xem một giải pháp có thoát ra để tăng độ sâu nhất định, nếu tôi gọi tìm kiếm với độ sâu = 40 và độ sâu 2, nó nên Chạy Limsearch vượt qua độ sâu giá trị 2 lúc đầu, sau đó 4, 6, 8, 10 .. cho đến khi nó đạt tới 36 thì nó sẽ tìm ra giải pháp nguyên nhân của nó trong 35 nhưng nó không hoạt động, thay vào đó tôi nhận được sol = Không có trong tất cả các trường hợp như thể tôi đang gọi Limsearch với các giá trị khác. i know the solution to the limSearch algoritm is in a depth=35 but want this other algorithm to check if a solution exits for a given depth increment so, if i call search with depthl=40 and a depthi of 2, it should run limSearch passing in depthact the value 2 at first, then 4, 6, 8, 10.. until it reaches 36 that then it should find the solution cause of it being in 35 but it does not work, instead im getting a sol=None in all cases as if i was calling limSearch with other values.

tìm kiếm def (vấn đề, chiến lược, 40, 2, cắt tỉa):

Tôi muốn một cuộc gọi như thế này ở trong vòng lặp gọi Limsearch cho đến khi nó đạt được một giải pháp trong thuật toán đó trong trường hợp này có độ sâu = 35. Vì vậy, kết quả dự kiến ​​của tôi là:

Sol = Limsearch (vấn đề, chiến lược, 2, cắt tỉa)

Sol = Limsearch (vấn đề, chiến lược, 4, cắt tỉa)

Sol = Limsearch (vấn đề, chiến lược, 6, cắt tỉa)

...

Sol = Limsearch (vấn đề, chiến lược, 36, cắt tỉa)

Trong lần lặp cuối cùng này, Sol sẽ không phải là không và sau đó vòng lặp trong khi sẽ không còn được thực hiện trả lại cho tôi giải pháp mong muốn.

Bối cảnh mà tôi gọi là chức năng này là như sau:

if(strategy == 3): sol = search(p, strategy, depthl, depthi, pruning)
else: sol = limSearch(p, strategy, depthl, pruning)

Sau khi đọc tất cả các giá trị giá trị theo đầu vào của người dùng.

depthl = int(input('depth: '))-1
if(strategy == 3): depthi = int(input('depth increment: '))

Python chuyển các đối số không bằng cách tham chiếu cũng như giá trị, mà bằng cách gán.

Python có gán theo giá trị hoặc tham chiếu 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.

Sao chép một đối tượng trong Python

Trong Python, chúng tôi sử dụng toán tử
if(strategy == 3): sol = search(p, strategy, depthl, depthi, pruning)
else: sol = limSearch(p, strategy, depthl, pruning)
6 để tạo một bản sao của một đối tượng. Bạn có thể nghĩ rằng điều này tạo ra một đối tượng mới; nó không. Nó chỉ tạo ra một biến mới chia sẻ tham chiếu của đối tượng gốc.

Hãy lấy một ví dụ trong đó chúng tôi tạo một danh sách có tên Old_list và chuyển một tham chiếu đối tượng đến new_list bằng toán tử

if(strategy == 3): sol = search(p, strategy, depthl, depthi, pruning)
else: sol = limSearch(p, strategy, depthl, pruning)
6.

Old List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
ID of Old List: 140673303268168

New List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
ID of New List: 140673303268168

Ví dụ 1: Sao chép bằng cách sử dụng = toán tử

old_list = [[1, 2, 3], [4, 5, 6], [7, 8, 'a']]
new_list = old_list

new_list[2][2] = 9

print('Old List:', old_list)
print('ID of Old List:', id(old_list))

print('New List:', new_list)
print('ID of New List:', id(new_list))


Khi chúng tôi chạy trên chương trình, đầu ra sẽ là:

  1. Như bạn có thể thấy từ đầu ra, cả hai biến Old_List và New_list chia sẻ cùng một ID i.e
    if(strategy == 3): sol = search(p, strategy, depthl, depthi, pruning)
    else: sol = limSearch(p, strategy, depthl, pruning)
    
    8.
  2. Vì vậy, nếu bạn muốn sửa đổi bất kỳ giá trị nào trong new_list hoặc old_list, thay đổi có thể nhìn thấy trong cả hai.

Về cơ bản, đôi khi bạn có thể muốn có các giá trị ban đầu không thay đổi và chỉ sửa đổi các giá trị mới hoặc ngược lại. Trong Python, có hai cách để tạo bản sao:


Bản sao nông

Sao chép sâu

import copy
copy.copy(x)
copy.deepcopy(x)

Để làm cho các bản sao này hoạt động, chúng tôi sử dụng mô -đun

if(strategy == 3): sol = search(p, strategy, depthl, depthi, pruning)
else: sol = limSearch(p, strategy, depthl, pruning)
9.


Như bạn có thể thấy từ đầu ra, cả hai biến Old_List và New_list chia sẻ cùng một ID i.e if(strategy == 3): sol = search(p, strategy, depthl, depthi, pruning) else: sol = limSearch(p, strategy, depthl, pruning) 8.

Vì vậy, nếu bạn muốn sửa đổi bất kỳ giá trị nào trong new_list hoặc old_list, thay đổi có thể nhìn thấy trong cả hai.

Về cơ bản, đôi khi bạn có thể muốn có các giá trị ban đầu không thay đổi và chỉ sửa đổi các giá trị mới hoặc ngược lại. Trong Python, có hai cách để tạo bản sao:

Bản sao nông

import copy

old_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
new_list = copy.copy(old_list)

print("Old list:", old_list)
print("New list:", new_list)

Sao chép sâu

Old list: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
New list: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Để làm cho các bản sao này hoạt động, chúng tôi sử dụng mô -đun

if(strategy == 3): sol = search(p, strategy, depthl, depthi, pruning)
else: sol = limSearch(p, strategy, depthl, pruning)
9.

Sao chép mô -đun

Chúng tôi sử dụng mô -đun

if(strategy == 3): sol = search(p, strategy, depthl, depthi, pruning)
else: sol = limSearch(p, strategy, depthl, pruning)
9 của Python cho các hoạt động sao chép nông và sâu. Giả sử, bạn cần sao chép danh sách hỗn hợp nói x. Ví dụ:


Ở đây, depthl = int(input('depth: '))-1 if(strategy == 3): depthi = int(input('depth increment: ')) 1 trả về một bản sao nông của x. Tương tự, depthl = int(input('depth: '))-1 if(strategy == 3): depthi = int(input('depth increment: ')) 2 Trả về một bản sao sâu của x.

import copy

old_list = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
new_list = copy.copy(old_list)

old_list.append([4, 4, 4])

print("Old list:", old_list)
print("New list:", new_list)

Khi chúng tôi chạy chương trình, nó sẽ xuất hiện:

Old list: [[1, 1, 1], [2, 2, 2], [3, 3, 3], [4, 4, 4]]
New list: [[1, 1, 1], [2, 2, 2], [3, 3, 3]]

Một bản sao nông tạo ra một đối tượng mới lưu trữ tham chiếu của các phần tử gốc.

Vì vậy, một bản sao nông không tạo ra một bản sao của các đối tượng lồng nhau, thay vào đó, nó chỉ sao chép tham chiếu của các đối tượng lồng nhau. Điều này có nghĩa là, một quá trình sao chép không tái diễn hoặc tạo các bản sao của chính các đối tượng lồng nhau.


Ví dụ 2: Tạo bản sao bằng cách sử dụng bản sao nông cạn

Khi chúng tôi chạy chương trình, đầu ra sẽ là:

Khi chúng tôi chạy chương trình, nó sẽ xuất hiện:

if(strategy == 3): sol = search(p, strategy, depthl, depthi, pruning)
else: sol = limSearch(p, strategy, depthl, pruning)
1

Trong chương trình trên, chúng tôi đã tạo một danh sách lồng nhau và sau đó sao chép nông cạn bằng phương pháp

depthl = int(input('depth: '))-1
if(strategy == 3): depthi = int(input('depth increment: '))
1.


Vì vậy, nếu bạn muốn sửa đổi bất kỳ giá trị nào trong new_list hoặc old_list, thay đổi có thể nhìn thấy trong cả hai.

Về cơ bản, đôi khi bạn có thể muốn có các giá trị ban đầu không thay đổi và chỉ sửa đổi các giá trị mới hoặc ngược lại. Trong Python, có hai cách để tạo bản sao:

Tuy nhiên, hãy tiếp tục với ví dụ 2. Tuy nhiên, chúng tôi sẽ tạo bản sao sâu bằng hàm

depthl = int(input('depth: '))-1
if(strategy == 3): depthi = int(input('depth increment: '))
2 có trong mô -đun
if(strategy == 3): sol = search(p, strategy, depthl, depthi, pruning)
else: sol = limSearch(p, strategy, depthl, pruning)
9. Bản sao sâu tạo ra bản sao độc lập của đối tượng gốc và tất cả các đối tượng lồng nhau của nó.

Ví dụ 5: Sao chép danh sách bằng DeepCopy ()

if(strategy == 3): sol = search(p, strategy, depthl, depthi, pruning)
else: sol = limSearch(p, strategy, depthl, pruning)
2

Khi chúng tôi chạy chương trình, nó sẽ xuất hiện:

if(strategy == 3): sol = search(p, strategy, depthl, depthi, pruning)
else: sol = limSearch(p, strategy, depthl, pruning)
3

Trong chương trình trên, chúng tôi sử dụng hàm

depthl = int(input('depth: '))-1
if(strategy == 3): depthi = int(input('depth increment: '))
2 để tạo bản sao trông tương tự.

Tuy nhiên, nếu bạn thực hiện các thay đổi đối với bất kỳ đối tượng lồng nhau nào trong đối tượng gốc Old_list, bạn sẽ thấy không có thay đổi nào đối với bản sao new_list.


Ví dụ 6: Thêm một đối tượng lồng nhau mới trong danh sách bằng cách sử dụng Sao chép sâu

if(strategy == 3): sol = search(p, strategy, depthl, depthi, pruning)
else: sol = limSearch(p, strategy, depthl, pruning)
4

Khi chúng tôi chạy chương trình, nó sẽ xuất hiện:

if(strategy == 3): sol = search(p, strategy, depthl, depthi, pruning)
else: sol = limSearch(p, strategy, depthl, pruning)
5

Trong chương trình trên, chúng tôi sử dụng hàm

depthl = int(input('depth: '))-1
if(strategy == 3): depthi = int(input('depth increment: '))
2 để tạo bản sao trông tương tự.

Làm thế nào để bạn sao chép thay vì tham khảo trong Python?

Để có được một bản sao độc lập hoàn toàn của một đối tượng, bạn có thể sử dụng hàm Copy.DeepCopy ().copy. deepcopy() function.

Làm thế nào để bạn sao chép giá trị của một biến trong Python?

Ví dụ, sao chép một đối tượng bằng cách sử dụng.using = operator in python For example, if we have a variable named var1 referring to an object and we assign var1 to var2 by the statement var2=var1 , both the variables point to the same object and thus will have the same ID.

Python sao chép theo giá trị hoặc tham chiếu?

Python chuyển các đối số không bằng cách tham chiếu cũng như giá trị, mà bằng cách gán.neither by reference nor by value, but by assignment.

Python có gán theo giá trị hoặc tham chiếu 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.