你们说 Python 这个是 Bug 还是 Feature?

2022-08-30 15:44:32 +08:00
 lanlanye
class Foo:
    def __init__(self, s: set = set()):
        self.s = s


if __name__ == "__main__":
    f1 = Foo()
    f2 = Foo()
    f1.s.add(1)
    f1.s.add(2)
    f1.s.add(3)
    print(f2.s)

版本 3.10.4

结果会是什么呢?

7120 次点击
所在节点    Python
71 条回复
janxin
2022-08-31 10:32:28 +08:00
这是 Feature
lolizeppelin
2022-08-31 13:38:06 +08:00
python 其实挺 c 的...
对象全是引用传递
DonkeyBenjamin
2022-08-31 15:07:33 +08:00
这个不是 python 新手常见问题,python💩山里面成堆出现的吗?
一般人都知道可以这么写

def foo(l=None):
l = l or []
Namek77
2022-08-31 16:32:38 +08:00
我记得 Pyright 是可以检测出来的
x7DnVcd9bA706oWp
2022-08-31 17:11:32 +08:00
@Aloento 都是坑而已,何必纠结坑的哪个更坑;我现在到 go 坑了
rebeccaMyKid
2022-08-31 18:02:59 +08:00
正确的:
```
class Foo:
def __init__(self, s: set[int] | None = None):
self.s = s or set()


if __name__ == "__main__":
f1 = Foo(set())
f2 = Foo()
f1.s.add(1)
f1.s.add(2)
f1.s.add(3)
print(f2.s)
print(f1.s)

```
apake
2022-08-31 18:45:35 +08:00
并不是 bug, 也不是 feature. 是一个编程要注意的事项. 默认参数不要使用可变类型.

@lolizeppelin 并不是引用传递, 而是按值传递引用
chrawsl
2022-09-01 09:40:19 +08:00
编辑器会提示不建议这么写,这么写只会实例化一个 set 对象
llsquaer
2022-09-01 19:22:36 +08:00
又学到一个不被裁的方法了..哈哈
Alias4ck
2022-09-02 16:11:27 +08:00
It's a bug,but also is a feature. It depends on how to use it.
缓存数据的时候可以用这个特性 参考 https://foofish.net/python-tricks.html
```python

def factorial(num, cache={}):
if num == 0:
return 1
if num not in cache:
print('xxx')
cache[num] = factorial(num - 1) * num
return cache[num]


print(factorial(4))
print("-------")
print(factorial(4))
```
JasonLaw
2023-01-08 12:50:47 +08:00

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

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

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

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

© 2021 V2EX