Изменяемость массивов numpy и списков Python в качестве аргументов функцииPython

Программы на Python
Ответить
Anonymous
 Изменяемость массивов numpy и списков Python в качестве аргументов функции

Сообщение Anonymous »

Мне нужен совет о том, как массивы numpy и списки Python передаются в функции. В частности, VBA и другие языки, с которыми я знаком, могут быть явными в определении функции, если аргумент передается черезVal или byRef. Python в лучшем случае кажется запутанным, поскольку кажется, что он передает аргументы поVal (фактически), если только аргумент не является изменяемым, в котором он передавался поRef (фактически). Однако я не понимаю, как это работает с изменяемыми массивами и списками. Является ли мое мнение об эквивалентности mutable/immutable byRef/byVal ошибочным? Должен ли я .deepcopy() какие-либо параметры массива в первой строке функции, чтобы исключить риск непредвиденных последствий?
Надеюсь, это показывает, что я имею в виду с массивом numpy (происходит то же самое) при этом список Python изменяется посредством понимания, а не цикла для каждого элемента):

Код: Выделить всё

import numpy as np

def inc_elements(my_array):
for i in range(len(my_array)):
my_array[i] = my_array[i] + 1.0
# same effect as: my_array[i] += 1.0
return my_array

def inc_array(my_array):
my_array = np.add(my_array, np.full_like(my_array, 1.0))
# same effect as: my_array = my_array + np.full_like(my_array, 1.0)
# and:            my_array = my_array + 1.0
# but NOT:        my_array += 1.0
return my_array

def del_element(my_array):
my_array = np.delete(my_array, [0,])
return my_array

functions = [inc_elements, inc_array, del_element]
for func in functions:
old_array = np.array([0., 1., 2.])
print(f'old_array = {old_array}, {type(old_array)}')
new_array = func(old_array)
print(f'after {func.__name__}:')
print(f'new array = {new_array}, {type(new_array)}')
print(f'old_array = {old_array}, {type(old_array)}\n')
del old_array, new_array
old_array = [0. 1. 2.],

после inc_elements:

новый массив = [1. 2. 3.],

old_array = [1. 2. 3.],
old_array = [0. 1. 2.],

после inc_array:

новый массив = [1. 2. 3.],

old_array = [0. 1. 2.],
old_array = [0. 1. 2.],

после del_element:

новый массив = [1. 2.],

old_array = [0. 1. 2.],
Похоже, что элементы массива аргументов изменяемы, поэтому, если я изменяю их по одному с помощью inc_elements, значения также изменяются в аргументе моей функции, но сам массив не (?), поэтому, если я использую функцию numpy для изменения всего массива в inc_array или < em>del_element (даже если он изменяет только элементы массива), он не меняет аргумент моей функции. Это вообще правда? Я хотел бы понять, потому что у меня будут случаи, когда я передаю подмассив или даже один элемент массива в функцию, и я также хотел бы знать, применимо ли то же самое ко всем другим функциям numpy, например. заменить:

Код: Выделить всё

    my_array = np.add(my_array, np.full_like(my_array, 1.0))
с любой другой функцией, например:

Код: Выделить всё

    my_array = np.sqrt(my_array)
Я также заметил, что расширенный оператор присваивания a += b, примененный к массиву numpy, ведет себя как функция с циклом и не эквивалентен a = a + b, которого у меня не было. ожидается.
Может ли кто-нибудь порекомендовать достойный учебник (или ссылку), который может подробно объяснить, как аргументы массива и списка передаются в функции Python?
Большое спасибо.

Подробнее здесь: https://stackoverflow.com/questions/791 ... -arguments
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»