任何修补Python足够长的人都被以下问题咬伤(或撕成碎片):
def foo(a=[]):
a.append(5)
return a
Run Code Online (Sandbox Code Playgroud)
Python新手希望这个函数总能返回一个只包含一个元素的列表:[5]
.结果却非常不同,而且非常惊人(对于新手来说):
>>> foo()
[5]
>>> foo()
[5, 5]
>>> foo()
[5, 5, 5]
>>> foo()
[5, 5, 5, 5]
>>> foo()
Run Code Online (Sandbox Code Playgroud)
我的一位经理曾经第一次遇到这个功能,并称其为该语言的"戏剧性设计缺陷".我回答说这个行为有一个潜在的解释,如果你不理解内部,那确实非常令人费解和意想不到.但是,我无法回答(对自己)以下问题:在函数定义中绑定默认参数的原因是什么,而不是在函数执行时?我怀疑经验丰富的行为有实际用途(谁真的在C中使用静态变量,没有繁殖错误?)
编辑:
巴泽克提出了一个有趣的例子.再加上你的大部分评论和特别是Utaal,我进一步阐述了:
>>> def a():
... print("a executed")
... return []
...
>>>
>>> def b(x=a()):
... x.append(5)
... print(x)
...
a executed
>>> b()
[5]
>>> b()
[5, 5]
Run Code Online (Sandbox Code Playgroud)
对我而言,似乎设计决策是相对于放置参数范围的位置:在函数内部还是"与它一起"?
在函数内部进行绑定意味着在调用函数时x
有效地绑定到指定的默认值,而不是定义,这会产生一个深层次的缺陷:def
在某种意义上,该行将是"混合"的(部分绑定)函数对象)将在定义时发生,并在函数调用时发生部分(默认参数的赋值).
实际行为更加一致:执行该行时,该行的所有内容都会得到评估,这意味着在函数定义中.
python language-design least-astonishment default-parameters
我知道它可以做到,但我永远不会记得如何.
如何在python中重新导入模块?方案如下:我以交互方式导入模块并修改它,但后来我遇到了错误.我修复.py文件中的错误然后我想重新导入修复模块而不退出python.我该怎么做 ?
在JavaScript中,每个对象都是实例和类.要进行继承,可以使用任何对象实例作为原型.
在Python,C++等中,有类和实例作为单独的概念.为了进行继承,您必须使用基类来创建一个新类,然后可以使用它来生成派生实例.
为什么JavaScript会朝这个方向发展(基于原型的面向对象)?基于原型的OO相对于传统的,基于类的OO有哪些优点(和缺点)?
是否存在任何标准的"自带电池"方法来清除Python脚本中的终端屏幕,还是我必须去诅咒(库,而不是单词)?
我想知道在Python中是否有任何用于异步方法调用的库.如果你可以做类似的事情会很棒
@async
def longComputation():
<code>
token = longComputation()
token.registerCallback(callback_function)
# alternative, polling
while not token.finished():
doSomethingElse()
if token.finished():
result = token.result()
Run Code Online (Sandbox Code Playgroud)
或者异步调用非异步例程
def longComputation()
<code>
token = asynccall(longComputation())
Run Code Online (Sandbox Code Playgroud)
如果在语言核心中使用更加精细的策略,那就太棒了.这是考虑过吗?
以下代码绘制到两个PostScript(.ps)文件,但第二个包含两行.
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
plt.subplot(111)
x = [1,10]
y = [30, 1000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("first.ps")
plt.subplot(111)
x = [10,100]
y = [10, 10000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("second.ps")
Run Code Online (Sandbox Code Playgroud)
我如何告诉matplotlib重新开始第二个情节?
目前,唯一完全支持的语言,以及浏览器中DOM树操作的事实标准是JavaScript.看起来它有深层设计问题,使它成为新手的漏洞和安全漏洞的雷区.
您是否知道在下一代浏览器中为DOM树操作和HTTP请求引入任何类型(不仅是javascript)的更好(重新设计)语言的任何现有或计划的主动性?如果是,那么将它集成到Firefox中的路线图是什么?如果不是,那么由于什么原因(互操作性除外)应该是JavaScript浏览器平台上唯一支持的语言?
我已经使用过jQuery,我也读过"javascript:好的部分".确实这些建议很好,但我无法理解的是:为什么只有javascript?在服务器端(你最喜欢的os平台),我们可以使用每种语言操作DOM树,甚至是fortran.为什么客户端(浏览器平台)仅支持javascript?
我无法通过HTTP GET查询字符串重复字段查找有关行为的权威信息,例如
http://example.com/page?field=foo&field=bar
Run Code Online (Sandbox Code Playgroud)
特别是如果保留或不保留订单.大多数面向Web的语言产生一个包含与关键"字段"相关联的foo和bar的数组,但我想知道是否存在关于这一点的权威声明(例如在RFC上).RFC 3986有一个部分3.4. Query
,它引用了键=值对,但没有说明如何解释顺序和重复字段等.这是有道理的,因为它依赖于后端,而不属于RFC的范围......
虽然存在事实上的标准,但我希望看到它的权威来源,只是出于好奇.
我在csv文件中有这个数据集
1.33570301776, 3.61194e-06, 7.24503e-06, -9.91572e-06, 1.25098e-05, 0.0102828, 0.010352, 0.0102677, 0.0103789, 0.00161604, 0.00167978, 0.00159998, 0.00182596, 0.0019804, 0.0133687, 0.010329, 0.00163437, 0.00191202, 0.0134425
1.34538754675, 3.3689e-06, 9.86066e-06, -9.12075e-06, 1.18058e-05, 0.00334344, 0.00342207, 0.00332897, 0.00345504, 0.00165532, 0.00170412, 0.00164234, 0.00441903, 0.00459294, 0.00449357, 0.00339737, 0.00166596, 0.00451926, 0.00455153
1.34808186291, -1.99011e-06, 6.53026e-06, -1.18909e-05, 9.52337e-06, 0.00158065, 0.00166529, 0.0015657, 0.0017022, 0.000740644, 0.00078635, 0.000730052, 0.00219736, 0.00238191, 0.00212762, 0.00163783, 0.000750669, 0.00230171, 0.00217917
Run Code Online (Sandbox Code Playgroud)
如您所见,数字格式不同且未对齐.在vim中是否有一种方法可以快速正确地对齐列,因此结果就是这样
1.33570301776, 3.61194e-06, 7.24503e-06, -9.91572e-06, 1.25098e-05, 0.0102828, 0.010352, 0.0102677, 0.0103789, 0.00161604, 0.00167978, 0.00159998, 0.00182596, 0.0019804, 0.0133687, 0.010329, 0.00163437, 0.00191202, 0.0134425
1.34538754675, 3.3689e-06, …
Run Code Online (Sandbox Code Playgroud) python ×5
javascript ×2
asynchronous ×1
browser ×1
http ×1
inheritance ×1
java ×1
matplotlib ×1
oop ×1
performance ×1
plot ×1
reformat ×1
terminal ×1
uri ×1
vim ×1