django views.py 中, datetime.datetime.now() 作为默认参数时值不会改变

2017-02-06 11:48:33 +08:00
 cheerzeng

hi , 如题, 不知道这是不是 django 的特性?直接用 python 试了没这效果。

import datetime
def test(a, b=datetime.datetime.now()):
    print a
    print "b %s" %b
    print "c %s" %datetime.datetime.now()

test(2)

输出结果 b 的值不会改变, c 的正常。

2360 次点击
所在节点    Python
14 条回复
111111111111
2017-02-06 11:55:50 +08:00
In [1]: import datetime

In [2]: def test(a, b=datetime.datetime.now()):
...: print a
...: print "b %s" %b
...: print "c %s" %datetime.datetime.now()
...:


In [3]: import time

In [4]: for i in range(6):
...: time.sleep( 2)
...: test(i)
...:
0
b 2017-02-06 11:53:42.707000
c 2017-02-06 11:55:00.035000
1
b 2017-02-06 11:53:42.707000
c 2017-02-06 11:55:02.039000
2
b 2017-02-06 11:53:42.707000
c 2017-02-06 11:55:04.044000
3
b 2017-02-06 11:53:42.707000
c 2017-02-06 11:55:06.049000
111111111111
2017-02-06 11:57:15 +08:00
111111111111
2017-02-06 11:59:10 +08:00
@111111111111 打开之后搜索“原因解释如下:”
jingniao
2017-02-06 12:00:13 +08:00
年前刚遇到这个问题,你把括号去掉就好了
pango
2017-02-06 12:01:57 +08:00
请使用:
b=lambda: datetime.datetime.now()

建议先把书看看好,基础概念弄清楚后可以节省很多时间
eyeKi1l
2017-02-06 12:14:47 +08:00
默认参数的默认值何时被计算?
cxh116
2017-02-06 12:25:24 +08:00
def test(a, b=None)):
if b is None:
b = datetime.datetime.now()

易懂的办法
cheerzeng
2017-02-06 13:42:14 +08:00
@111111111111 @cxh116 @eyeKi1l @jingniao @pango 谢谢各位,基础功也确实欠缺。
julyclyde
2017-02-06 14:58:47 +08:00
@pango lambda 原来是这么用的!学习了!
julyclyde
2017-02-06 14:59:09 +08:00
@eyeKi1l 默认参数的默认值被计算的时间,是“运行该函数声明行”的时间
eyeKi1l
2017-02-06 19:08:18 +08:00
@julyclyde 我在质问楼主谢谢
julyclyde
2017-02-06 22:01:08 +08:00
@eyeKi1l 那你应该用感叹号啊
twoyuan
2017-02-07 09:08:08 +08:00
话说这边使用 lambda 和直接传 b=datetime.datetime.now 一样吧
ibigbug
2017-02-07 20:26:10 +08:00
@julyclyde 只是一种提示的语气了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/338407

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX