使用随机 python 的奇怪输出



我有这个问题,我根据随机性对列表进行排序。 算法的工作原理是两个选择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 观看此视频

你的函数会改变k并返回对它的引用。没有正在创建新的list

您所看到的区别在于:

  • 打印时,将显示algoX返回内容的当前状态(这是对k的引用)。

  • 分配结果时,将z1z2设置为 k 的引用,表示z1 is z2 is k。而且只有在完成操作后才能打印k.这就是为什么你看到相同的结果,所有这 3 个变量对同一列表都有相同的引用

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

我也会看看random.shuffle,它几乎可以做你想要的事情。请注意,random.shuffle还会就地修改输入,因此您也需要[:]

当您向两个函数传递、修改和返回相同的变量 (list) k时,您每次都会修改相同的数据。

尝试使用:

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

这将返回变量的标识。你会注意到 z1、z2 和 k 都有相同的恒等式。

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

但是,当您分配返回变量,保存它然后打印它时,您会注意到这个问题。

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

试试这个:

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

您只是覆盖了相同的列表。谷歌搜索"python不可变与可变类型"来理解这种行为。

最新更新