小编Ste*_*ini的帖子

"最小的惊讶"和可变的默认论证

任何修补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

2458
推荐指数
31
解决办法
14万
查看次数

在交互时重新导入python中的模块

我知道它可以做到,但我永远不会记得如何.

如何在python中重新导入模块?方案如下:我以交互方式导入模块并修改它,但后来我遇到了错误.我修复.py文件中的错误然后我想重新导入修复模块而不退出python.我该怎么做 ?

python

330
推荐指数
5
解决办法
14万
查看次数

基于原型与基于类的继承

在JavaScript中,每个对象都是实例和类.要进行继承,可以使用任何对象实例作为原型.

在Python,C++等中,有类和实例作为单独的概念.为了进行继承,您必须使用基类来创建一个新类,然后可以使用它来生成派生实例.

为什么JavaScript会朝这个方向发展(基于原型的面向对象)?基于原型的OO相对于传统的,基于类的OO有哪些优点(和缺点)?

javascript oop inheritance prototype-programming

197
推荐指数
3
解决办法
7万
查看次数

Java真的很慢吗?

Java 在缓慢方面有一定程度的声誉.

  • Java真的很慢吗?
  • 如果是,为什么?瓶颈在哪里(或曾经)?是因为效率低下的JVM?垃圾收集?纯字节码库而不是JNI包装的C代码?许多其他语言都具有这些功能,但它们并不具有这种缓慢的声誉.

java performance

180
推荐指数
11
解决办法
7万
查看次数

清除Python中的终端

是否存在任何标准的"自带电池"方法来清除Python脚本中的终端屏幕,还是我必须去诅咒(库,而不是单词)?

python terminal

175
推荐指数
12
解决办法
31万
查看次数

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)

如果在语言核心中使用更加精细的策略,那就太棒了.这是考虑过吗?

python asynchronous

170
推荐指数
10
解决办法
20万
查看次数

我怎么告诉matplotlib我已经完成了一个情节?

以下代码绘制到两个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重新开始第二个情节?

python plot matplotlib

150
推荐指数
6
解决办法
16万
查看次数

JavaScript的替代品

目前,唯一完全支持的语言,以及浏览器中DOM树操作的事实标准是JavaScript.看起来它有深层设计问题,使它成为新手的漏洞和安全漏洞的雷区.

您是否知道在下一代浏览器中为DOM树操作和HTTP请求引入任何类型(不仅是javascript)的更好(重新设计)语言的任何现有或计划的主动性?如果是,那么将它集成到Firefox中的路线图是什么?如果不是,那么由于什么原因(互操作性除外)应该是JavaScript浏览器平台上唯一支持的语言?

我已经使用过jQuery,我也读过"javascript:好的部分".确实这些建议很好,但我无法理解的是:为什么只有javascript?在服务器端(你最喜欢的os平台),我们可以使用每种语言操作DOM树,甚至是fortran.为什么客户端(浏览器平台)仅支持javascript?

javascript browser

140
推荐指数
7
解决办法
6万
查看次数

重复HTTP GET查询键的权威位置

我无法通过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的范围......

虽然存在事实上的标准,但我希望看到它的权威来源,只是出于好奇.

uri http

134
推荐指数
5
解决办法
3万
查看次数

在vim中重新格式化以获得漂亮的列布局

我在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)

vim reformat

120
推荐指数
7
解决办法
5万
查看次数