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]