Существует множество причин, по которым он не работает.
Во-первых, в функции read_occupation
вы меняете привязку локальной переменной.Оригинальный объект остается нетронутым.Напротив, в get_p_values
вы модифицируете объект (оператор []
вызывает функцию __setitem__
объекта, который изменяет внутреннее представление).Лучшей идеей в этом случае будет использование правильного объекта.
Если вы хотите изменить все содержимое списка в read_occupation
, вы можете использовать оператор объединения списков, чтобы назначить весь список:
def read_occupation(matrix):
matrix[:] = [ [1, 2, 3] ]
Кстати, если вы вызовете функцию read_occupation
, вызывающая сторона, вероятно, будет ожидать, что она не изменит свой параметр.Вам, вероятно, следует переименовать его update_occupation
или что-то в этом роде.
Во-вторых, когда вы создаете свои переменные посредством умножения, вы получаете list
, где каждый индекс содержит ссылку на один и тот же элемент.Код p = [ [0] ] * 3
эквивалентен:
>>> l = [0] # Naming the list for more clarity
>>> p = [ l, l, l ] # Each index points to the same list `l`
В-третьих, класс Process
ожидает tuple
(или фактически объект, следующий за повторяемым протоколом) для своего параметра args
.Вы не передаете кортеж, а один элемент, который оказывается list
из одного int
(именно поэтому вы получаете исключение TypeError
).Вам нужно использовать следующий синтаксис для передачи tuple
:
# Please note the comma after the closing bracket, it is important
p1 = Process( target=read_occupation, args=( matrix[ index ], ) )
# In python, the syntax for a tuple is weird for tuple of size < 2
# . tuple of 0 item: ()
# . tuple of 1 item: (1,)
# . tuple of 2 items: (1, 2)
В-четвертых, вы используете multiprocessing.Process
, который порождает новый процесс, в котором выполняется ваш код.В вашем коде нет связи (я не знаю, возможно ли вернуть информацию из этого процесса в исходный).Таким образом, переменная в исходном коде не изменяется.