默认参数可变性和最小惊讶原则
Python 社区长期以来一直在努力解决“最小惊讶”原则,该原则旨在直观且符合预期的设计功能。然而,默认参数的可变性令人费解地偏离了这一原则。
考虑以下函数:
def foo(a=[]): a.append(5) return a
Python 新手可能会预期在不带参数的情况下调用此函数将始终生成一个列表只有一个元素:[5]。然而,实际行为要奇怪得多:
>>> foo() [5] >>> foo() [5, 5] >>> foo() [5, 5, 5] >>> foo() [5, 5, 5, 5]
这种行为引起了一些人的批评,他们认为这是一个“戏剧性的设计缺陷”。然而,它背后有一个逻辑解释。
Python 中的函数是一流的对象,这意味着它们可以像任何其他类型一样被操作并分配给变量。当执行 def 语句时,会创建一个函数对象。该对象不仅包含函数的代码,还包含其默认参数,这些参数存储为属性。
默认情况下,默认参数在函数定义时而不是在函数调用时计算。这意味着默认参数的状态可以在程序执行过程中发生变化,从而导致 foo 函数中观察到的行为。
此设计决策源于保持一致性的需要。如果在函数调用时计算默认参数,则 def 行将成为混合语句,其中部分绑定将在定义和调用时发生。这种方法会带来额外的复杂性和潜在的混乱。
正如 effbot 所指出的,这种行为并非没有实际应用。例如,考虑以下代码:
def a(): print("a executed") return [] def b(x=a()): x.append(5) print(x) a executed >>> b() [5] >>> b() [5, 5]
这里,x 的默认值在函数定义时计算,确保 a() 只被调用一次,无论 b() 被调用了多少次
总之,Python 中默认参数的可变性是一种有意的设计选择,它优先考虑一致性并符合一流函数的原则。虽然它最初看起来可能违反直觉,但它在函数实现方面提供了更好的控制和灵活性。
以上是为什么 Python 的默认参数可变性似乎违反了最小惊讶原则?的详细内容。更多信息请关注PHP中文网其他相关文章!

pythonlistsareimplementedasdynamicarrays,notlinkedlists.1)他们areStoredIncoNtiguulMemoryBlocks,mayrequireRealLealLocationWhenAppendingItems,EmpactingPerformance.2)LinkesedlistSwoldOfferefeRefeRefeRefeRefficeInsertions/DeletionsButslowerIndexeDexedAccess,Lestpypytypypytypypytypy

pythonoffersFourmainMethodStoreMoveElement Fromalist:1)删除(值)emovesthefirstoccurrenceofavalue,2)pop(index)emovesanderturnsanelementataSpecifiedIndex,3)delstatementremoveselemsbybybyselementbybyindexorslicebybyindexorslice,and 4)

toresolvea“ dermissionded”错误Whenrunningascript,跟随台词:1)CheckAndAdjustTheScript'Spermissions ofchmod xmyscript.shtomakeitexecutable.2)nesureThEseRethEserethescriptistriptocriptibationalocatiforecationAdirectorywherewhereyOuhaveWritePerMissionsyOuhaveWritePermissionsyYouHaveWritePermissions,susteSyAsyOURHomeRecretectory。

ArraysarecrucialinPythonimageprocessingastheyenableefficientmanipulationandanalysisofimagedata.1)ImagesareconvertedtoNumPyarrays,withgrayscaleimagesas2Darraysandcolorimagesas3Darrays.2)Arraysallowforvectorizedoperations,enablingfastadjustmentslikebri

ArraySaresificatificallyfasterthanlistsForoperationsBenefiting fromDirectMemoryAcccccccCesandFixed-Sizestructures.1)conscessingElements:arraysprovideconstant-timeaccessduetocontoconcotigunmorystorage.2)iteration:araysleveragececacelocality.3)

ArraySareBetterForlement-WiseOperationsDuetofasterAccessCessCessCessCessCessAndOptimizedImplementations.1)ArrayshaveContiguucuulmemoryfordirectAccesscess.2)列出sareflexible butslible dueTopotentEnallymideNamicizing.3)forlarargedAtaTasetsetsetsetsetsetsetsetsetsetsetlib

在NumPy中进行整个数组的数学运算可以通过向量化操作高效实现。 1)使用简单运算符如加法(arr 2)可对数组进行运算。 2)NumPy使用C语言底层库,提升了运算速度。 3)可以进行乘法、除法、指数等复杂运算。 4)需注意广播操作,确保数组形状兼容。 5)使用NumPy函数如np.sum()能显着提高性能。

在Python中,向列表插入元素有两种主要方法:1)使用insert(index,value)方法,可以在指定索引处插入元素,但在大列表开头插入效率低;2)使用append(value)方法,在列表末尾添加元素,效率高。对于大列表,建议使用append()或考虑使用deque或NumPy数组来优化性能。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

禅工作室 13.0.1
功能强大的PHP集成开发环境

记事本++7.3.1
好用且免费的代码编辑器

Dreamweaver Mac版
视觉化网页开发工具

WebStorm Mac版
好用的JavaScript开发工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。