【问题标题】:Is there an accepted way to have a function pop a value from a parameter?是否有一种可接受的方式让函数从参数中弹出一个值?
【发布时间】:2016-08-12 15:37:25
【问题描述】:

基本上,我想知道我是否应该尽可能避免函数中的副作用,或者在某些情况下副作用是否可以接受。我想要一个函数 pops 并从字典中返回一个键,我很好奇该函数是否应该只返回键:

def popkey(d):
    k, v = d.popitem()
    return k

mykey = popkey(d)

或者如果它也应该返回修改后的字典:

def popkey(d):
    k, v = d.popitem()
    return k, d

mykey, d = popkey(d)

更具体地说,我有类似以下的内容,我需要继续查看字典,所以我想pop 键,因为它们与列表中的元素配对。

def pop_nearest(d, pt):
    """Pops the key in `d` which is nearest to pt."""
    to_pop = min(d.iterkeys(), key=lambda a: abs(a - pt))
    d.pop(to_pop)

pts = [1,3,5,7,9]
for pt in pts:
    nearest_pt = pop_nearest(d, pt)
    # do some other stuff

【问题讨论】:

    标签: python dictionary side-effects


    【解决方案1】:

    不需要返回参数,因为您已经在调用站点上引用了它。

    如果您选择将pop_nearest 实现为dict 子类中的方法,那么有时返回self 是一个好主意(取决于您要实现的目标),这样您就可以链接调用。

    class MyDict(dict):
       ...
       def pop_nearest(self, pt):
         ...
         return self
    
    ...
    x = mydict.pop_nearest(1).pop_nearest(2) 
    

    【讨论】:

      【解决方案2】:

      您不需要返回修改后的字典。它像您想的那样在函数中进行修改,因为它是指向实际对象的引用/指针,而不是深层副本,并且在调用 pop 后将以修改后的形式存在于调用函数中。返回密钥应该就足够了,并且可以按照您的意愿工作。

      【讨论】:

        猜你喜欢
        • 2013-05-10
        • 2014-08-07
        • 2021-04-19
        • 1970-01-01
        • 1970-01-01
        • 2011-08-08
        • 1970-01-01
        • 2020-07-09
        • 2011-03-04
        相关资源
        最近更新 更多