当前位置: 首页 > 面试题库 >

为什么“可变默认参数修复”语法如此丑陋,请问python newbie

阮华美
2023-03-14
问题内容

特权

转到http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-
languages-have-
variables

并向下滚动到“默认参数值”。在那里您可以找到以下内容:

def bad_append(new_item, a_list=[]):
    a_list.append(new_item)
    return a_list

def good_append(new_item, a_list=None):
    if a_list is None:
        a_list = []
    a_list.append(new_item)
    return a_list

与此示例相同,python.org上甚至有一个“重要警告”,但并不是真的说它“更好”。

一种表达方式

因此,这里的问题是:为什么 在一个已知问题上“好的”语法在
丑陋的情况下却像促进“优雅的语法”和“易于使用”的编程语言那样丑陋呢?

编辑:

另一种表达方式

我不是在问 它为什么或如何发生 (感谢Mark提供的链接)。

我在问 为什么没有比这更简单的内置语言

我认为,一种更好的方法可能是自己做一些事情def,其中将name参数附加到def可变对象内的“本地”或“新”对象。就像是:

def better_append(new_item, a_list=immutable([])):
    a_list.append(new_item)
    return a_list

我确定有人可以提供更好的语法,但是我也想必须对为什么没有做到这一点有一个很好的解释。


问题答案:

默认参数是在def执行语句时求值的,这可能是最合理的方法:通常是所需要的。如果不是这种情况,当环境稍有变化时,可能会导致令人困惑的结果。

用魔术local方法或类似方法进行区分远非理想。Python试图使事情变得平淡无奇,并且没有明显,清楚的替代当前样板的方法,而没有采用混乱的方式来替代Python当前具有的相当一致的语义。



 类似资料:
  • 问题内容: 我有这个丑陋的代码: 如何摆脱多个if语句? 问题答案: 这对于您的情况更好。 (可选)您应该尽可能选择Switch Case 如果您已经分析了’v’的值,通常在大多数情况下都位于较低范围( <10),则无法添加。 根据您的分析,您还可以更改条件顺序。如果您知道大多数值都小于10,然后第二位的大多数值位于68-117之间,则可以相应地更改条件序列。 编辑:

  • 问题内容: 为什么这段代码会引发SyntaxError? 尽管以下代码段运行时没有可见错误: 问题答案: 必须将所有必需的参数放在任何默认参数之前。仅仅是因为它们是强制性的,而默认参数不是必需的。从语法上讲,如果允许使用混合模式,解释器将 无法 决定哪些值与哪些参数匹配。如果参数的输入顺序不正确,则会引发A : 让我们使用您的函数来查看关键字参数。 假设其允许声明函数如上,然后使用上述声明,我们可

  • 假设我有这些表: 表A在两个字段上有一个复合主键: 员工ID(字符串) 表B也有一个复合主键,但在三个字段上: 员工ID(字符串) 交易ID(Long) 日期(Date) 在表B中,员工ID和事务ID上有一个外键,称为“FK1”(为简单起见)。 由于表A中使用的复合id用于多个映射的Hibernate类,因此我创建了一个可以重用的类: 因此,映射到表A的类如下所示: 映射到表B的类如下所示: 显然

  • 我有一个apikey“令牌”,它必须在每个请求中作为查询参数提供。我如何设置翻新,以便始终在请求中包含此查询参数? 我当前将内标识作为默认参数提供: 但是由于我知道每个请求都需要相同的令牌,所以在我创建的每个请求函数中必须提供它作为默认参数,这感觉是多余的。我如何设置reverfit来用默认的查询参数修饰每个传出的请求? 这是我如何构建reverfit2实例的: 我认为在调用.build()之前,

  • 问题内容: 我很难理解算法中问题的根本原因。然后,通过逐步简化函数,我发现Python中对默认参数的求值行为不符合我的预期。 代码如下: 问题是,如果未显式给出属性,则Node类的每个实例都共享相同的属性,例如: 我不了解此设计决定的逻辑吗?为什么Python设计人员决定在定义时评估默认参数?这对我来说似乎很违反直觉。 问题答案: 另一种选择是重量级的-将“默认参数值”存储为函数对象的“ thun

  • 问题内容: 长时间修改Python的任何人都被以下问题咬伤(或弄成碎片): Python新手希望此函数始终返回仅包含一个元素的列表[5]。结果是非常不同的,并且非常令人惊讶(对于新手而言): 我的一位经理曾经第一次遇到此功能,因此称其为“严重的设计缺陷”。我回答说,这种行为有一个基本的解释,如果您不了解内部原理,那确实是非常令人困惑和意外的。但是,我无法(对自己)回答以下问题:在函数定义而不是函数