Python Вызовите значение бу и позвоните по ссылке - PullRequest
0 голосов
/ 24 апреля 2020

Я пробовал разные python структуры данных. Кажется, когда мы используем список, dict или любой другой пользовательский объект, он передается по ссылке, когда вызывается любой метод, который изменяет этот объект. Но все это объект в python, тогда почему бы не int и строка не изменилась.

Как python решает, какой из них передать по ссылке или передать по значению? Как и в C или C ++, мы можем явно указать, следует ли передавать по значению или передавать по ссылке. Откуда python интерпретатор знает, какой из них использовать когда?

Вот некоторый код, который я пробовал

class Car(object):
    def __init__(self, color):
        self.color = color

def change_car_color(car):
    car.color = 'blue'
    return car

class LinkedList(object):
    def __init__(self, value):
        self.value = value
        self.next = None

def print_linked_list(ll):
    elements = []
    while(ll):
        elements.append(str(ll.value))
        ll = ll.next
    return "->".join(elements)

def change_linked_list_element_values(ll):
    while(ll):
        ll.value = -1
        ll = ll.next
    return ll

def reverse_linked_list(ll):
    current = ll
    neXt = ll.next
    current.next = None
    while(neXt):
        temp = neXt.next
        neXt.next = current
        current = neXt
        neXt = temp
    return current


def change_int(number):
    number = -1
    return number

def change_string(name):
    name = "this string has been modified"
    return name

def change_list(python_list):
    for i in range(len(python_list)):
        python_list[i] = -1
    return python_list

def change_dict(python_dict):
    for i in python_dict:
        python_dict[i] = -1
    return python_dict


#--------->>int object
num = 1
change_int(num) # chnages num to -1
print(num) # print 1

#--------->>string object
name = "I love python not the programming language but the reptile!"
change_string(name) # changes it to 'this string has been modified'
print(name) # print 'I love python not the programming language but the reptile!'


#--------->>list object
list_object = [1,2,3,4,5]
change_list(list_object) # changes it to [-1, -1, -1, -1, -1]
print(list_object) # prints [-1, -1, -1, -1, -1]

#---------->>dictionary object
dict_object = {'first':1, 'second':2, 'third':3, 'fourth':4, 'fifth':5}
change_dict(dict_object) # changes it to {'first': -1, 'second': -1, 'third': -1, 'fourth': -1, 'fifth': -1}
print(dict_object) # print {'first': -1, 'second': -1, 'third': -1, 'fourth': -1, 'fifth': -1}


#----------->>custom car object
car = Car('red')
print(car.color) # print red
change_car_color(car) # chnages it to blue
print(car.color) # print blue

#----------->>custom linked list
linked_list = LinkedList(1)
linked_list.next = LinkedList(2)
linked_list.next.next = LinkedList(3)
linked_list.next.next.next = LinkedList(4)
linked_list.next.next.next.next = LinkedList(5)

cp_linked_list = linked_list # copy of the linked list


print("before modification 1: ", print_linked_list(linked_list)) # prints before modification:  1->2->3->4->5
print("before modification 2: ", print_linked_list(cp_linked_list)) # prints before modification 2:  1->2->3->4->5

change_linked_list_element_values(linked_list) # change all element to -1
print("after modification 1: ", print_linked_list(linked_list)) # prints after modification 1:  -1->-1->-1->-1->-1
print("after modification 1: ", print_linked_list(cp_linked_list)) # prints after modification 1:  -1->-1->-1->-1->-1

change_linked_list_element_values(cp_linked_list) # change all element to -1
print("after modification 2: ", print_linked_list(cp_linked_list)) # prints after modification 2:  -1->-1->-1->-1->-1


# reinitializing linked list
linked_list = LinkedList(1)
linked_list.next = LinkedList(2)
linked_list.next.next = LinkedList(3)
linked_list.next.next.next = LinkedList(4)
linked_list.next.next.next.next = LinkedList(5)

print(print_linked_list(linked_list)) # print 1->2->3->4->5
reversed_linked_list = reverse_linked_list(linked_list) # reverses the linked list

print(print_linked_list(linked_list)) # print 1
print(print_linked_list(reversed_linked_list)) # print 5->4->3->2->1

1 Ответ

0 голосов
/ 24 апреля 2020

Python имеет изменяемые объекты и неизменные объекты. Я верю, что для разработчика на C / C ++ будет более понятно, что это передача по ссылке и передача по значению в Python.

Вы должны прочесть разницу в целом. Мне никогда не приходилось создавать неизменный объект, но все равно приятно знать: https://www.blog.pythonlibrary.org/2014/01/17/how-to-create-immutable-classes-in-python/

...