【问题标题】:In python should a function change a list or make a copy and return that? [closed]在 python 中,函数应该更改列表还是复制并返回? [关闭]
【发布时间】:2013-06-04 17:00:39
【问题描述】:

我正在制作一个函数来执行中点位移算法,以及其他一些看起来很逼真的地形生成函数,在一个二维列表(格式为 [[n11,n12,...],[n11,n12,. ..],...])

我的问题是,在 python 中,在这种情况下更改输入列表是标准的(没有返回值)还是制作列表的深层副本并返回它更好?

我知道复制和返回的效率较低,但是我不希望使用该函数让其他人感到困惑。

【问题讨论】:

标签: python list function standards


【解决方案1】:

就个人而言,我将其作为第一种方法,因为我的许多应用程序都对效率至关重要。

如果有必要,我的解决方案是设置一个标志,并根据标志采取不同的方式。例如,函数是:

def func(input, deepcopy=false):
    if deepcopy:
        // deep copy the input as to_process
    else:
        // just point to_process to the input
    // process with the to_process        

【讨论】:

  • 这迎合了有人可能将列表 slice 作为输入传递的可能性,在这种情况下必须返回一个副本。
  • @chepner 当然,该功能仅在可能的情况下才有效。在你提到的具体情况下,我们不能这样做。
  • @chepner,您的评论帮助我学到了一些东西。我从没想过切片不会被视为与列表相同的方式,因为切片属于<type 'list'>。进一步查看后,我发现您可以传递一个列表和一个切片对象,然后可以就地修改切片。
  • 传递切片的问题是切片是一个list对象,它唯一的引用是函数中的参数名。一旦函数返回,该引用就会超出范围,并且切片上的引用计数变为 0。您根本无法通过函数外部方式查看修改切片的结果。
【解决方案2】:

这也是我经常思考的问题。第二种方法可能更干净、更好,因为客户不需要对你的功能做任何假设,而且不会让人困惑。就我个人而言,我更喜欢这样。每当我调用一个函数时,我希望它返回一个旧值不变的新值。但是,那只是我。

【讨论】:

    猜你喜欢
    • 2020-07-05
    • 2011-03-11
    • 2014-04-17
    • 2012-09-09
    • 1970-01-01
    • 2011-02-25
    • 2010-12-10
    • 1970-01-01
    • 2011-08-01
    相关资源
    最近更新 更多