看到了这样一段代码:
def foo(a, b=[]): b.append(a) print b
回复内容:
<span class="o">>>></span> <span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">bar</span><span class="o">=</span><span class="p">[]):</span>
<span class="o">...</span> <span class="k">return</span> <span class="n">bar</span>
<span class="o">>>></span> <span class="n">foo</span><span class="o">.</span><span class="n">func_name</span>
<span class="s">'foo'</span>
<span class="o">>>></span> <span class="n">foo</span><span class="o">.</span><span class="n">func_defaults</span>
<span class="p">([],)</span>
<span class="o">>>></span> <span class="n">foo</span><span class="p">()</span> <span class="ow">is</span> <span class="n">foo</span><span class="o">.</span><span class="n">func_defaults</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="bp">True</span>
官方文档解释在这里:default args 的求值是在定义的时候,只做一次4. More Control Flow Tools
但是……
>>> def f(a, b=[]):
... b.append(a)
... print b
...
>>> f(1)
[1]
>>> f(1)
[1, 1]
>>> def f(a, b=None):
... b = b if b is not None else []
... b.append(a)
... print b
...
>>> f(1)
[1]
>>> f(1)
[1]
>>> f(1)
[1]
>>> a = []
>>> b = []
>>> a.append(1)
>>> b
[]
>>>
啥都不用说,加一个id()输出b的所谓的地址,你就明白了
note, 建议了解一下 def foo(a=[])和 foo(a=[])的区别:前者是参数默认值,后者是keyword arguments. 还有这种def foo(*args, **kargs) 和 这种 foo(*args, **kargs), 都是有细微区别的。 不会的, 默认值之间是共享的, 只会创建一次, 并不会每次创建一个新的对象. 也就是说使用可变对象作为函数的默认值时会导致函数的混乱. 同理使用字典作为默认参数,会得出类似的返回.
<span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">k</span><span class="p">,</span><span class="n">v</span><span class="p">,</span> <span class="n">fdict</span><span class="o">=</span><span class="p">{}):</span>
<span class="n">fdict</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
<span class="k">print</span> <span class="n">fdict</span>
<span class="n">foo</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span>
<span class="n">foo</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">)</span>

使用Java的StringBuilder.append()函数拼接字符串在Java编程中,字符串的拼接是非常常见的操作。为了高效地拼接字符串,Java提供了StringBuilder类,其中的append()函数可以快速地将多个字符串连接在一起。StringBuilder是一个可变的字符序列,使用起来比String类更加高效。当我们需要拼接大量字符串时,使用

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。需要注意的是,append()方法只能用于列表对象,不能用于其他类型的对象。此外,append()方法会直接修改原列表,而不会返回一个新的列表。

Java中如何使用StringBuilder类的append()方法来拼接字符串在Java中,拼接字符串是一项常见的操作。在拼接过程中,如果使用基本的String类来进行字符串相加,会导致频繁的创建新的String对象,从而影响性能。为了解决这个问题,Java提供了StringBuilder类来进行字符串的拼接操作。StringBuilder类是Java中一

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。append命令的用法为“append [选项] 源文件 目标文件”,其中,源文件是要追加的文件,目标文件是要被追加的文件。

Python是一种流行的编程语言,旨在使计算机编程变得更加简单和易于理解。在Python中,用print函数向控制台输出文本是一个基本的任务。在本文中,我们将介绍Python的print函数,探索其功能和使用示例,并提供代码示例来帮助您更好地了解如何使用该函数。Python的print函数是一个内置的函数,用于输出文本和变量的值。它的语法非常简单。您只需将要

printscreen键在键盘设备的方向键上,有“prtsc sysrq”字样,位于f12的右侧。如果没有“prtsc sysrq”字样的按键,可找到“fn”和“insert(prt sc)”,先点击“fn”,再点击‘insert(PRT sc)’实现printscreen截图功能。

Python是一种简单易学的高级编程语言,被广泛用于数据分析、人工智能、Web开发等领域。在Python中,print是一个常用的函数,用于在屏幕上输出结果或调试信息。本文将详细介绍print函数的用法,并提供具体的代码示例帮助读者更好地掌握。首先,print函数可以接受多个参数,并将它们打印到屏幕上。这些参数可以是字符串、整数、浮点数等,甚至还可以是变量、

vb中print是输出语句,在WINDOWS图形界面下,该语句实在没有存在的必要了;而在VB.NET版本里,作为打印输出Print也已经不复存在了。


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

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

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

Dreamweaver CS6
视觉化网页开发工具

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具