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

2017 年 2 月 6 日
 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 的正常。

3193 次点击
所在节点    Python
14 条回复
111111111111
2017 年 2 月 6 日
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 年 2 月 6 日
111111111111
2017 年 2 月 6 日
@111111111111 打开之后搜索“原因解释如下:”
jingniao
2017 年 2 月 6 日
年前刚遇到这个问题,你把括号去掉就好了
pango
2017 年 2 月 6 日
请使用:
b=lambda: datetime.datetime.now()

建议先把书看看好,基础概念弄清楚后可以节省很多时间
eyeKi1l
2017 年 2 月 6 日
默认参数的默认值何时被计算?
cxh116
2017 年 2 月 6 日
def test(a, b=None)):
if b is None:
b = datetime.datetime.now()

易懂的办法
cheerzeng
2017 年 2 月 6 日
@111111111111 @cxh116 @eyeKi1l @jingniao @pango 谢谢各位,基础功也确实欠缺。
julyclyde
2017 年 2 月 6 日
@pango lambda 原来是这么用的!学习了!
julyclyde
2017 年 2 月 6 日
@eyeKi1l 默认参数的默认值被计算的时间,是“运行该函数声明行”的时间
eyeKi1l
2017 年 2 月 6 日
@julyclyde 我在质问楼主谢谢
julyclyde
2017 年 2 月 6 日
@eyeKi1l 那你应该用感叹号啊
twoyuan
2017 年 2 月 7 日
话说这边使用 lambda 和直接传 b=datetime.datetime.now 一样吧
ibigbug
2017 年 2 月 7 日
@julyclyde 只是一种提示的语气了。

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

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

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

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

© 2021 V2EX