一段有趣的Python代码示例与解析

def buggy(arg, result=[]):
    print(result)
    result.append(arg)
    print(result)

buggy(‘a’) buggy(‘b’) buggy(‘c’)

学到了新知识……

https://stackoverflow.com/questions/2335160/what-is-the-scope-of-a-defaulted-parameter-in-python


一段有趣的Python代码示例与解析

26 回复

这段代码展示了Python的简洁性和灵活性。它通过列表推导式和条件表达式,快速筛选并处理数据,同时利用内置函数提升效率。

# 示例:筛选并处理列表中的偶数
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_squared = [x**2 for x in numbers if x % 2 == 0]
print(even_squared)  # 输出: [4, 16, 36, 64, 100]

# 解析:
# 1. 列表推导式 [x**2 for x in numbers if x % 2 == 0] 遍历numbers列表
# 2. if x % 2 == 0 筛选出偶数
# 3. x**2 对每个偶数计算平方
# 4. 结果直接生成新列表

# 进阶示例:使用lambda和map
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
squared = list(map(lambda x: x**2, even_numbers))
print(squared)  # 输出相同结果

# 这种写法体现了Python的函数式编程特性
# filter()用于筛选,map()用于转换,lambda创建匿名函数

代码的核心在于利用Python的高级特性用最少的代码完成数据处理任务。


我不认为这是无聊,这可能会是一个没有注意到的坑

对啊,函数的默认参数是属于静态变量来的,包括 doc 串

<br>def A():<br> 'i am A'<br> pass<br>help(A)<br>a.__doc__ = "i am not A"<br>help(A)<br>

不要在参数默认值中使用引用类型这难道不应该是常识?

为什么要钻牛角尖…正常情况下根本不会出现这种代码

默认参数使用引用类型就是这样,以前看过一本 python 书还举了例子

#4 还真不是常识,比如 JS 就不是这样的。

我觉得这个还挺有意思的.

所谓的常识都是这样踩坑踩出来的

这是 python 的知名坑

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Default_parameters#%E4%BC%A0%E5%85%A5_undefined_vs_%E5%85%B6%E4%BB%96%E7%A9%BA%E5%80%BC
在函数被调用时,参数默认值会被解析,所以不像 Python 中的例子,每次函数调用时都会创建一个新的参数对象。


MDN 点名批评 Python

这句话写的看起来有歧义

又一个标题党

这个属于 Python 的坑,基本上都会踩到

通常推荐使用 None 代替。基本上每个 Python 教程都会提到这个问题 比如官方入门:

https://docs.python.org/3/tutorial/controlflow.html#default-argument-values

IDE 会警告的啊

无数人讲过 python 默认参数的“坑”了,我提供另外一个思路,函数尽量不要有副作用。这样无论 python 内部怎么实现,都不会出现问题(当然如果是性能不足,肯定需要研究语言的实现机制)。

python 一切都是对象

fluent Python 有讲过

最开始学 python 的时候,你看的入门书籍里没告诉过你不要这样写?

但对 python 来说是常识啊

我还以为这是常识 会写 python 都知道

每本 python 书应该都会讲到这个吧

这是坑,默认变量的坑……

Python 入门必采坑+1
还有 深拷贝 浅拷贝
可迭代对象的元素是列表等

推荐 python cookbook,fluent python
你会发现 有意思的事还有很多 2333

默认参数不用可变类型,不讲这个的新手教程都不是好书

回到顶部