【问题标题】:after passing a variable to the funtion the original variable becomes none in python [duplicate]将变量传递给函数后,原始变量在python中变为无[重复]
【发布时间】:2017-10-24 18:31:42
【问题描述】:

我有以下代码

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? 为什么程序会这样?

【问题讨论】:

  • ssgs等是什么?
  • 尝试评论您的电话:ssgs = ssgs.SSGS() pheno = ssgs.s_SGS(ind)。他们可能会使用全局 pop 变量。

标签: python


【解决方案1】:

因为列表是可变数据类型。而这些在 Python 中传递它们的指针(就像任何常规对象一样),而不是像字符串或整数那样充当单个单元。它会自动复制自己。

这使您可以做到这一点。将列表传递给函数并从那里修改它。这有很多好处。

因此,如果您要将列表传递给正在对其执行操作的函数,但您不希望更改原始列表,则必须复制原始列表以仅在函数中本地使用:

clist = my_list[:] # Use slicing to make a copy of my_list
serial(clist)

要在本地使用它,不要分配它,只需执行 serial(my_list[:])

附:不要调用你的列表 pop,因为 pop 是 list() 实例的一个方法,所以会让人感到困惑。

【讨论】:

  • 感谢@Dalen 的解决方案和建议。
猜你喜欢
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 2017-12-07
  • 2014-01-11
相关资源
最近更新 更多