为什么此清单的价值在变化?我没有试图改变它

时间:2019-09-01 07:21:27

标签: python list data-structures

我创建了一个名为“数据”的列表,用于存储列表。

    Grid = [[0, 0, 0, 0], [1, 0, 0, 0], [2, 1, 0, 0], [1, 2, 3, 0]]
data = [[[1, 5, 7, 6, 8], 10, [5, 10], []], [[], 20, [10, 20, 3], []], [[], 4, [1, 11, 2], []], [[], 5, [7, 8, 9], []]]
size = len(Grid)
n_weeks = len(data[0][0])

def return_sch(demand, avail, sr):
    sum_sr =0
    for i in range(len(sr)):
        sum_sr = sum_sr +sr[i]
    avail = avail+sum_sr
    n = len(demand)
    for i in range(n):
        if demand[i]<avail:
            avail = avail - demand[i]
            demand[i] =0
        elif demand[i]>=0:
            demand[i] = demand[i]-avail
            avail =0
    return demand

print(data[0][0])
print(return_sch(data[0][0], data[0][1], data[0][2]))
print(data[0][0])            

更多参考:

data[i] is data of the ith item. 

data[i][0] => demand of ith item
data[i][1] => availability of ith item
data[i][2] => scheduled reciept of ith item
data[i][3] => prouduction schedule

但是,为什么data [0] [0]的值改变了?我不想更改它。

请提出一些建议。谢谢。

3 个答案:

答案 0 :(得分:2)

因为data[0][0]是一个数组,所以值发生了变化,并且您通过引用return_sch函数将其传递。在此函数内,此数组称为demand,在此函数内,可通过写入demand的单元格来对其进行修改。并且由于demand只是原始数组的名称,因此您可以修改原始数组。

如果您不希望函数更改数组,则可以选择:

  • 改写函数以根据demand创建自己的数组。我会把这样做的乐趣留给自己:-)
  • 只需复制原始数组。通过传递list(data[0][0])而不是data[0][0]在呼叫站点进行复制,例如:
print(data[0][0])
print(return_sch(list(data[0][0]), data[0][1], data[0][2]))
print(data[0][0])            
  • 或通过在开头添加demand = list(demand)在函数内复制(从软件工程的角度来看更可取),例如:
def return_sch(demand, avail, sr):
    demand = list(demand)
    sum_sr = 0
    for i in range(len(sr)):
        sum_sr = sum_sr + sr[i]
    avail = avail + sum_sr
    n = len(demand)
    for i in range(n):
        if demand[i] < avail:
            avail = avail - demand[i]
            demand[i] = 0
        elif demand[i] >= 0:
            demand[i] = demand[i] - avail
            avail = 0
    return demand

答案 1 :(得分:0)

您正在传递要使用的列表。由于list是一个可变对象,因此您实际上是在进行通过引用传递。因此,更改将反映回传递的数据。

一个简单的例子来说明我的观点:

def list_append(lst):
    lst.append('another_value')

some_lst = ['some_value']
list_append(some_lst)

print(some_lst)
# ['some_value', 'another_value']

对于元组而言,这是不正确的,因为它是不可变的:

def tuple_append(tupl):
    tupl += ('another_value',)

some_tupl = ('some_value',)
tuple_append(some_tupl)

print(some_tupl)
# ('some_value',)

答案 2 :(得分:0)

此行:

 demand[i] = demand[i]-avail

更改data[0][0]

您将data[0][0]作为第一个参数return_sch传递到demanddemand现在是对data[0][0]所引用对象的引用。因此,当您更改demand[i]时,就是在修改data所指的内容。

相关问题