【问题标题】:Appending lists in list having some problems在列表中附加列表有一些问题
【发布时间】:2021-11-29 15:55:02
【问题描述】:

如果我已经在lista_input 中添加了一些内容,那么每当在generabinario() 方法中修改参数arr 时(例如:arr[I] = 0/1),lista_input 中的所有值也会以完全相同的方式修改方式。

发生了什么事?

这是给定程序的输出:

[[1, 1], [1, 1], [1, 1], [1, 1]]

当然输出是 [1, 1] 的序列,因为它是该方法对 arr 参数所做的最后一次修改。

这就是代码:

lista_input = []

def generabinario(n, arr, i):
    if i == n:
        lista_input.append(arr)
        return
    arr[i] = 0
    generabinario(n, arr, i + 1)
    arr[i] = 1
    generabinario(n, arr, i + 1)


if __name__ == "__main__":
    weights = []
    results = []
    print("Inserisci il numero di pesi da inserire")
    num = int(input())
    print("Inserisci i pesi")
    for i in range(0, num):
        weights.append(int(input()))
    inputs = [None] * num
    generabinario(2, inputs, 0)
    print(lista_input)

【问题讨论】:

  • 以防万一,将inputs = [None] * num替换为inputs = [None for _ in range(num)]并运行代码
  • 您每次都附加相同的arr,然后再对其进行修改,因此所有引用都会更新。你的意思是:lista_input.append(arr[:])?这每次都会附加一个唯一的 arr 副本。
  • @quamrana Ty,这解决了我的问题!

标签: python python-3.x list recursion


【解决方案1】:

试试:

lista_input = []

def generabinario(n, arr, i):
    if i == n:
        lista_input.append(arr[:])  # notice the arr[:]
        return
    arr[i] = 0
    generabinario(n, arr, i + 1)
    arr[i] = 1
    generabinario(n, arr, i + 1)


if __name__ == "__main__":
    weights = []
    results = []
    print("Inserisci il numero di pesi da inserire")
    num = int(input())
    print("Inserisci i pesi")
    for i in range(0, num):
        weights.append(int(input()))
    inputs = [None] * num
    generabinario(2, inputs, 0)
    print(lista_input)

arr[:] 创建一个全新的数组,而不是具有相同引用的“不同”数组。仅使用arr,每次调用都使用相同的数组,因为它们都具有相同的引用(即内存中的相同位置)。通过修改一个数组,你正在修改这个炮台,因此修改了所有指向这个炮台的数组。

查看另一个问题的答案,了解价值和参考是什么以及与之相关的行为:https://stackoverflow.com/a/986145/5446749

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2020-07-26
    • 2018-05-21
    • 2019-09-06
    相关资源
    最近更新 更多