【问题标题】:Adding sublist to list in python3 not working在python3中将子列表添加到列表不起作用
【发布时间】:2017-12-07 17:19:25
【问题描述】:

我在 Python3 中有一个非常奇怪的问题。我有一些代码可以从整数列表中生成一些不同的列表(这完全不相关)。

def get_next_state(state):

    max_val = max(state)
    max_index = state.index(max_val)
    new_state = state

    for n in range(max_val + 1):
        new_state[max_index] -= 1
        new_state[(n + max_index) % len(state)] += 1

    return new_state

现在我要做的就是将下一个状态添加到一些保留状态的列表中。这是我的代码:

l = [0, 2, 7, 0]
seen_states = []

for _ in range(10):
    print(l)
    seen_states += [l]
    l = get_next_state(l)

print(seen_states)

由于某种原因,列表l 在我打印时被正确分配,但它没有正确添加到已见状态列表中。请注意,我也尝试过seen_states.append(l),而不是使用+= [l]。有谁知道为什么会这样?

【问题讨论】:

  • 你的函数get_next_state()不应该返回新状态吗?
  • 嗯,是的,(忘记在此处添加)。现在将更新帖子。

标签: python-3.x list append


【解决方案1】:

为防止出现这些问题,请使用 copy, deepcopylist[:]

import copy

def get_next_state(state):

    max_val = max(state)
    max_index = state.index(max_val)
    new_state = copy.deepcopy(state)

    for n in range(max_val + 1):
        new_state[max_index] -= 1
        new_state[(n + max_index) % len(state)] += 1

    return new_state

您正在函数内发送您的列表l。当您将其分配给另一个名称时,您不是在制作副本,而是在引用原始对象。对这些列表的任何修改都是对原始对象的更改。

【讨论】:

  • 我添加了文档链接。它解释了列表等可变对象的问题
【解决方案2】:

get_next_state 中使用new_state = state[:](复制列表而不是引用原始列表)会产生以下输出:

[0, 2, 7, 0]
[2, 4, 1, 2]
[3, 1, 2, 3]
[0, 2, 3, 4]
[1, 3, 4, 1]
[2, 4, 1, 2]
[3, 1, 2, 3]
[0, 2, 3, 4]
[1, 3, 4, 1]
[2, 4, 1, 2]
[[0, 2, 7, 0], [2, 4, 1, 2], [3, 1, 2, 3], [0, 2, 3, 4], [1, 3, 4, 1], [2, 4, 1, 2], [3, 1, 2, 3], [0, 2, 3, 4], [1, 3, 4, 1], [2, 4, 1, 2]]

不确定这是否是您想要的输出,因为您没有将得到的内容指定为“错误”输出

【讨论】:

  • 谢谢!这确实是期望的输出。你知道为什么在语句中省略[:]new_state = state[:] 会产生错误的输出吗?
  • 你可以看看这个stackoverflow.com/a/17246744/8512629,它很好地解释了赋值与深拷贝和浅拷贝
猜你喜欢
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
相关资源
最近更新 更多