使用随机python的奇怪输出

2024-09-22 10:18:34 发布

您现在位置: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


Tags: in算法列表forlendefrandomprint
3条回答

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

我还想看一下^{},它可以做你想做的事情。请注意,random.shuffle还就地修改输入,因此您也需要[:]。你知道吗

函数改变k并返回对它的引用。没有创建新的list。你知道吗

你所看到的不同之处在于:

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

  • 当您赋值结果时,您将z1z2设置为k的引用,意思是z1 is z2 is k。只有在完成k操作之后才能打印。这就是为什么你会看到相同的结果,所有这3个变量对同一个列表有相同的引用。

在向两个函数传递、修改和返回相同的变量(list)k时,每次都修改相同的数据。你知道吗

尝试使用:

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

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

在第一种情况下,在调用下一个函数之前直接打印输出。这就是为什么你没有注意到这种行为。你知道吗

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

要解决它,与其修改传递给函数的列表,不如在函数内部创建一个新列表,为其赋值并返回该列表。你知道吗

相关问题 更多 >