使用随机python的奇怪输出

时间:2016-07-05 14:55:48

标签: python variables random

我有这个问题,我根据随机性排序列表。该算法如何工作是两个选择0到N-1之间的随机数(N是列表长度)和交换迭代索引。

我有两种不同的算法。

import random

def algo1(xx):
    for i in xrange(len(xx)):
        p = random.randrange(i, len(xx))  # random number between i and len(xx) - 1
        xx[i], xx[p] = xx[p], xx[i]
    return xx

def algo2(yy):
    for i in xrange(len(yy)):
        p = random.randrange(0, len(yy))  # random number between 0 and len(xx) - 1
        yy[i], yy[p] = yy[p], yy[i]
    return yy


k = range(5)
print algo1(k) 
print algo2(k)

这里一切正常。我打印algo1和algo2的返回值。

但是当我将返回值存储在变量

中时
z1 = algo1(k)
z2 = algo2(k)
print z1
print z2

它们都包含相同的列表。我运行了多少次他们显示相同的返回值

观看此视频https://www.youtube.com/watch?v=ZBjlnaCLKsQ&feature=youtu.be

4 个答案:

答案 0 :(得分:2)

您正在修改列表(我假设您使用的是python 2.7)。因此,当您使用k随机播放algo2时,您也会影响z1。所有三个列表都是同一个对象。您需要创建一个列表副本,例如algo1(k[:])

我还会看一下random.shuffle,它可以完成您想要的任务。请注意,random.shuffle也会修改输入,因此您也需要[:]

答案 1 :(得分:2)

您的函数会更改k并返回对它的引用。没有创建新的list

您所看到的不同之处是:

  • 当您打印时,您会显示<{1}}返回的当前状态(这是对algoX的引用)

  • 分配结果时,您将kz1设置为z2的引用,即k。并且只有在完成操作z1 is z2 is k之后才打印。这就是为什么你看到相同的结果,所有这3个变量都有相同的参考到同一个列表。

答案 2 :(得分:1)

当您传递,修改并将相同的变量(列表)k返回到这两个函数时,您每次都在修改相同的数据。

尝试使用:

print("z1", id(z1))
print("z2", id(z2))
print("k", id(k))

这将返回变量的标识。你会注意到z1,z2和k都具有相同的身份。

在第一种情况下,您在调用下一个函数之前直接打印输出。这就是您没有注意到这种行为的原因。

但是,当您分配返回变量,保存并打印它时,您会发现问题。

要解决此问题,不要修改已传递给函数的列表,而是在函数内部创建一个新列表,为其赋值并返回该列表。

答案 3 :(得分:1)

试试这个:

z1 = algo1(k)
print z1
z2 = algo2(k)
print z2
print z1
print k

您只需覆盖相同的列表即可。谷歌为“python Immutable vs Mutable类型”了解这种行为。