在循环中创建函数:解决后期绑定问题
尝试在循环中定义单个函数时,通常会遇到以下问题:尽管旨在表示唯一的结果,但所有函数都返回相同的值。这种现象称为后期绑定,发生的原因是函数在被调用之前不会接收其参数。
考虑以下使用 for 循环的示例:
functions = [] for i in range(3): def f(): return i functions.append(f)
如所写,每个函数在调用时查找 i 的相应值。然而,循环执行后,所有函数都将引用 i (2) 的最终值,从而产生以下输出:
print([f() for f in functions]) # Expected: [0, 1, 2] # Actual: [2, 2, 2]
解决方案:强制早期绑定
为了解决这个问题,有必要通过在定义时而不是调用时将参数分配给函数来强制早期绑定。这可以通过在函数定义中添加默认参数来实现:
functions = [] for i in range(3): def f(i=i): return i functions.append(f)
默认参数(在本例中为 i=i)在定义函数时计算,而不是在调用函数时计算。这确保每个函数保留其唯一的参数值,产生所需的输出:
print([f() for f in functions]) # Output: [0, 1, 2]
使用闭包的替代方法
如果担心可能存在其他参数要传递给函数,可以使用闭包实现更复杂的方法:
def make_f(i): def f(): return i return f
在这种情况下,创建函数工厂 (make_f)。在循环内,make_f 返回的函数被分配给 f 变量,而不是直接调用 def f():。这种方法保证每个函数保留其独占的参数值,就像早期的绑定解决方案一样。
以上是为什么循环中定义的函数经常返回相同的值,如何解决这个问题?的详细内容。更多信息请关注PHP中文网其他相关文章!

SlicingaPythonlistisdoneusingthesyntaxlist[start:stop:step].Here'showitworks:1)Startistheindexofthefirstelementtoinclude.2)Stopistheindexofthefirstelementtoexclude.3)Stepistheincrementbetweenelements.It'susefulforextractingportionsoflistsandcanuseneg

numpyallowsforvariousoperationsonArrays:1)basicarithmeticlikeaddition,减法,乘法和division; 2)evationAperationssuchasmatrixmultiplication; 3)element-wiseOperations wiseOperationswithOutexpliitloops; 4)

Arresinpython,尤其是Throughnumpyandpandas,weessentialFordataAnalysis,offeringSpeedAndeffied.1)NumpyArseNable efflaysenable efficefliceHandlingAtaSetSetSetSetSetSetSetSetSetSetSetsetSetSetSetSetsopplexoperationslikemovingaverages.2)

列表sandnumpyArraysInpyThonHavedIfferentMemoryfootprints:listSaremoreFlexibleButlessMemory-效率,而alenumpyArraySareSareOptimizedFornumericalData.1)listsStorReereReereReereReereFerenceStoObjects,withoverHeadeBheadaroundAroundaroundaround64bytaround64bitson64-bitsysysysyssyssyssyssyssyssysssys2)

toensurepythonscriptsbehavecorrectlyacrycrossdevelvermations,登台和生产,USETHESTERTATE:1)Environment varriablesforsimplesettings,2)configurationFilesForefilesForcomPlexSetups,3)dynamiCofforAdaptapity.eachmethodofferSuniquebeneiquebeneiquebeneniqueBenefitsaniqueBenefitsandrefitsandRequiresandRequireSandRequireSca

Python列表切片的基本语法是list[start:stop:step]。1.start是包含的第一个元素索引,2.stop是排除的第一个元素索引,3.step决定元素之间的步长。切片不仅用于提取数据,还可以修改和反转列表。

ListSoutPerformarRaysin:1)DynamicsizicsizingandFrequentInsertions/删除,2)储存的二聚体和3)MemoryFeliceFiceForceforseforsparsedata,butmayhaveslightperformancecostsinclentoperations。

toConvertapythonarraytoalist,usEthelist()constructororageneratorexpression.1)intimpthearraymoduleandcreateanArray.2)USELIST(ARR)或[XFORXINARR] to ConconverTittoalist,请考虑performorefformanceandmemoryfformanceandmemoryfformienceforlargedAtasetset。


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

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

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

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