大家来找茬?

2015-12-25 20:48:15 +08:00
 skywatcher
def setWithTimestamp(key, val, timestamp = datetime.now()):
    mc.set(key, {"timestamp" : timestamp, "data" : val})

这段代码有没有茬?

2380 次点击
所在节点    Python
8 条回复
xufang
2015-12-25 20:50:28 +08:00
这是常见 python 陷阱, maillist 和 stackoverflow 上声讨 python 这个特性很多次了。
bdbai
2015-12-25 21:12:16 +08:00
@xufang 弱弱问一下,是不是 `timestamp` 的值在脚本解释时已经定了?
skywatcher
2015-12-25 21:20:08 +08:00
@xufang 是的,刚测了, C++没这个问题
skywatcher
2015-12-26 16:13:47 +08:00
@bdbai Python 不太一样,当默认参数为函数时,运行程序那一刻就已经生成了固定的默认参数,以后都不变(如果默认值为 list 、 dict 等还能被修改而对下次函数调用默认值产生影响)
bdbai
2015-12-26 16:28:49 +08:00
@skywatcher 嗯,我的意思是,对于上面代码,在没有人为修改 `timestamp` 值的情况下,不管程序 sleep 多久,`timestamp` 的值总是不变的。这样理解对吗?
decaywood
2015-12-28 10:33:52 +08:00
最近踩过的坑:
```python
def setWithTimestamp(key, val, timestamp = NONE):
timestamp = datetime.now() if timestamp is NONE else timestamp
```
skywatcher
2015-12-29 23:16:54 +08:00
@decaywood 感觉完全没必要,应为如果你的程序不会被中断的话,每次都会执行 if 判断并执行 timestamp=datetime.now(),所以要么去掉默认参数,要么每次调用前必须赋值,感觉还减少了 if 判断。
skywatcher
2015-12-29 23:26:36 +08:00
@bdbai 程序 sleep?没太理解你的意思。运行时确定,以后每次调用都是调用相同的函数,包括参数值, dict 、 list 等做默认参数时会出现下次调用时为被修改过的值,具体可以查 python 参数默认值陷阱

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

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

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

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

© 2021 V2EX