我有以下代码
pop = [[2.162840682206156, 1.8735137437504137, 1.0432493688065905],
[2.8316083260339413, 1.3335260337446606, 0.7503595302921512]]
print '==>pop :: {}'.format(pop)
def serial(ind):
ssgs = ssgs.SSGS()
pheno = ssgs.s_SGS(ind)
print "serial :: {}".format(pheno.serial)
return pheno.serial,
for i in range(len(pop)):
print '==>pop1 :: {}'.format(pop[i])
value = serial(pop[i])
print '==>pop2 :: {}'.format(pop[i])
将列表 pop 传递给 serial()后,pop的值变为None,
==>pop :: [[2.162840682206156, 1.8735137437504137, 1.0432493688065905], [2.8316083260339413, 1.3335260337446606, 0.7503595302921512]]
==>pop1 :: [2.162840682206156, 1.8735137437504137, 1.0432493688065905]
serial :: [0, 0, 3]
==>pop2 :: [None, None, None]
==>pop1 :: [2.8316083260339413, 1.3335260337446606, 0.7503595302921512]
serial :: [0, 0, 3]
==>pop2 :: [None, None, None]
更新:我期待的输出是这样的,即pop的值不应该改变
==>pop1 :: [2.8316083260339413, 1.3335260337446606, 0.7503595302921512]
serial :: [0, 0, 3]
==>pop2 :: [2.8316083260339413, 1.3335260337446606, 0.7503595302921512]
更新: ssgs是一个作业调度类,可以找到每个任务的开始时间。
如果我是正确的, pop 的副本会发送到 serial(),那么为什么pop的值被 None替换?为什么程序以这种方式运行?
答案 0 :(得分:1)
因为列表是可变数据类型。这些在Python中传递它们的指针(像任何常规对象一样),而不是像字符串或整数一样充当单个单元。它自动复制自己。
这可以让你做到这一点。将列表传递给函数并从那里修改它。这有很多好处。
因此,如果您要将列表传递给正在执行某项操作的函数,但您不希望更改原始列表,则必须复制仅在函数中本地使用的原始文件:
clist = my_list[:] # Use slicing to make a copy of my_list
serial(clist)
要在本地使用它不要分配它,只需执行serial(my_list [:])
P.S。不要将列表调用为pop,因为pop是list()实例的一种方法,所以很容易让人感到困惑。