这是我的问题的简化示例.我认为这些函数会有完全相同的行为:
def f1(l):
if type(l[0][0])==list: f=lambda x:x[0][0]
else: f=lambda x:x[0]
l.sort(key=f,reverse=True)
def f2(l):
f=lambda x:x[0][0] if type(l[0][0])==list else lambda x:x[0]
l.sort(key=f,reverse=True)
l=[[1,2],[3,4]]
Run Code Online (Sandbox Code Playgroud)
但实际上,f1(l)当f2(l)异常崩溃时工作正常:
IndexError: list index out of range
Run Code Online (Sandbox Code Playgroud)
所以问题是为什么会这样,是否可以使用三元运算符来返回其中一个函数?
这是工作代码:
def g(y=10):
return y**2
def f(x,y=10):
return x*g(y)
print(f(5)) #->500
Run Code Online (Sandbox Code Playgroud)
但是,假设我们不想记住并将关键字参数的默认值复制y到外部函数的定义中(特别是如果有多层外部函数).在上面的例子中,它意味着我们想要使用已经定义的参数g.
一种方法:
def f(x,y=None):
if y==None: return x*g()
else: return x*g(y)
Run Code Online (Sandbox Code Playgroud)
但有没有更清洁的方法来做同样的事情?就像是:
def f(x,y=empty()):
return x*g(y)
Run Code Online (Sandbox Code Playgroud) 我已经尝试过deepcopyfromcopy模块。它适用于 OrderedDict 实例和 dict child 实例。但它不适用于 OrderedDict 子实例。这是一个演示:
from collections import OrderedDict
from copy import deepcopy
class Example2(dict):
def __init__(self,l):
dict.__init__(self,l)
class Example3(OrderedDict):
def __init__(self,l):
OrderedDict.__init__(self,l)
d1=OrderedDict([(1,1),(2,2)])
print(deepcopy(d1)) #OrderedDict([(1, 1), (2, 2)])
d2=Example2([(1,1),(2,2)])
print(deepcopy(d2)) #{1: 1, 2: 2}
d3=Example3([(1,1),(2,2)])
print(deepcopy(d3))
Run Code Online (Sandbox Code Playgroud)
前两个示例按预期工作,但最后一个因异常而崩溃:
TypeError: __init__() missing 1 required positional argument: 'l'
Run Code Online (Sandbox Code Playgroud)
所以问题是:这里的实际问题是什么,是否可以在deepcopy这种情况下使用该功能?