Глобальные переменные меняются, когда я запускаю свою функцию (python) - PullRequest
0 голосов
/ 10 января 2019

Я хотел бы получить совет по моей проблеме с приведенным ниже кодом. Я объявил несколько глобальных переменных (таких как shelfDim, a, b, c, d, productList). Эти глобальные переменные затем использовались в качестве аргументов по умолчанию в моих 2 функциях (packByLength, packByWidth).

Как часть функции packByWidth(), некоторые аргументы были изменены. Например, я создал новый список newDim, который в основном является копией productList. Затем функция изменяет этот список, меняя местами несколько элементов. Проблема в том, что мои глобальные переменные меняются в результате выполнения этой функции. Следовательно, вызов packByWidth() один раз дает правильный ответ, но повторный вызов дает мне неправильный ответ (поскольку глобальные переменные изменились при первом вызове).

Я знаю, что для Python, когда

a=[1,2,3]
b=a
b[0]=2

и a и b будут изменены на [2,2,3]. Однако я не ожидал, что это произойдет, поскольку мои операции со списками содержались внутри функции.

Может кто-нибудь сказать мне, что вызывает такое поведение, и что можно сделать, чтобы этого не произошло? Я бы хотел, чтобы мои глобальные переменные оставались неизменными независимо от того, сколько раз я запускаю свои функции! Постскриптум Я пытался использовать кортежи в моих глобальных переменных, но это не помогло. Спасибо!

import numpy as np

# Parameters
shelfDim = [100, 120, 150]
a = [15, 4, 30]
b = [11, 8, 12]
c = [5, 3.5, 18]
d = [23, 6.8, 10]
productList = [a, b, c, d]

# 1 All products to be aligned length-wise (assuming product must be placed upright)
def packByLength(products = productList, shelfDim = shelfDim):
    usableProdSpace =list(shelfDim)
    usableProdSpace[0] = usableProdSpace[0]/len(products)
    totalQty = []
    for product in products:
        packableQty = []
        for dim in range(3):
            packableQty.append(usableProdSpace[dim]//product[dim])
        totalQty.append(packableQty)

    return totalQty


# 2 All products to be aligned width-wise (assuming product must be placed upright)
def packByWidth(products = productList, shelfDim = shelfDim):
    swap = None
    newDim = list(products)
    for product in newDim:
        swap = product[0]
        product[0] = product[1]
        product[1] = swap
        print ('products', products)
        print ('newDim', newDim)
    totalQty = packByLength(products = newDim)

    return totalQty
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...