【问题标题】:I think it should contain different lists for each "append" but it is not [duplicate]我认为它应该包含每个“附加”的不同列表,但它不是[重复]
【发布时间】:2015-11-15 11:21:52
【问题描述】:

在我运行这段小代码后,它总是会返回一个包含完全相同的较小列表的列表...

import time
from random import randint

t = [0,0]
a = []

def rec():
    a.append(t)

for i in range(10):
    t[0] = randint(10,20)
    t[1] = randint(40,500)
    rec()
    time.sleep(.0001)

print a

我得到这样的输出,为什么?

[[17, 134], [17, 134], [17, 134], [17, 134], [17, 134], [17, 134], [17, 134], [17, 134], [17, 134], [17, 134]]

【问题讨论】:

  • 你正在重用t指向的列表。
  • 你可以说a.append(list(t)),它会先复制t
  • 你想得到什么?
  • 您每次都附加 same 列表,t 始终是同一个列表,更改列表将更改相同列表所在的列表。赋值、作为参数发送给函数或返回只是意味着您为同一个对象获得了另一个名称。

标签: python list python-2.7


【解决方案1】:

欢迎来到可变与不可变类型的古怪世界!

简而言之,在 Python 中列表是可变的,这意味着对列表的引用实际上会改变原始列表!您必须通过t = [randint(10,20), randint(40,500)] 创建一个新列表。这应该对你有用:)

有关可变与不可变类型的更多信息,请参阅this SO Q/A

我还建议不要使用像 rec 这样的函数。尽量避免在不需要时使用全局变量(它们使调试比需要的更困难)。为什么不直接传入一个参数?或者直接使用append inline!

【讨论】:

  • 但是你需要先声明它global,否则它只是一个本地列表,不会是rec附加的那个。
  • 但是t 已经在全局范围内声明了!添加了我的建议的 OPs 代码对我有用 :)
  • 谢谢!好吧,因为我使用装饰器来限制 rec() 运行的速度,所以我需要在那里定义一个函数...
【解决方案2】:

如何使用list comprehensions - [[randint(10,20), randint(40,500)] for i in range(10)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    相关资源
    最近更新 更多