Python 如果包装在for函数中,则函数无法转换列表元素

Python 如果包装在for函数中,则函数无法转换列表元素,python,list,function,random,Python,List,Function,Random,有人能解释以下代码的行为吗 import random abc = ['a', 'b', 'c'] xyz = ['x', 'y', 'z'] def randomize(x): random.shuffle(x) x = x[0] print('expected: ' + str(x)) return x random_list = [abc, xyz] for r in random_list: r = randomize(x=r)

有人能解释以下代码的行为吗

import random


abc = ['a', 'b', 'c']
xyz = ['x', 'y', 'z']


def randomize(x):
    random.shuffle(x)
    x = x[0]
    print('expected: ' + str(x))
    return x


random_list = [abc, xyz]

for r in random_list:
    r = randomize(x=r)


print('-----\n')

print('actual: ' + str(abc))
print('actual: ' + str(xyz))

如果我在for循环之外运行代码,它将按预期运行:

abc = randomize(abc)
print('actual: ' + str(abc))

我希望返回值与函数中打印的内容相匹配,但事实并非如此。

因此我们从
随机列表=[abc,xyz]

for r in random_list:
此时,
r
指的是列表
abc

    r = randomize(x=r)
r
现在指向一个新对象,该对象是从
randomize
返回的,与
abc
指向的对象不同

一个解决办法是

for i in len(random_list):
    random_list[i] = randomize(random_list[i])


你在期待什么?你能把这个问题包括在内吗。ThanksI对代码进行了编辑,使其更加清晰。希望能有帮助。谢谢。您确实复制了它,检查函数正在做什么-x=x[0],它应该输出第0个列表元素,但是您的实际列表包含整个列表,只是被洗牌了。寻求调试帮助的问题(“此代码为什么不工作?”)必须包括所需的行为,一个特定的问题或错误,以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参见:如何创建。你从来没有说过你的代码有什么问题。你应该提供你期望的结果和你得到的结果。代码完全按照它编写的目的执行,如果您编写的代码不正确,我们无法告诉您想要执行的操作。这看起来像是变量和范围的问题。如果将
print(r)
放入
for r in…
循环中,您将看到预期的值。但是,由于作用域,您不会更改实际列表。
random_list = [randomize(r) for element in random_list]