将变量传递给函数后,原始变量在python中变为none

时间:2017-05-24 12:04:50

标签: python

我有以下代码

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替换?为什么程序以这种方式运行?

1 个答案:

答案 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()实例的一种方法,所以很容易让人感到困惑。