- 主题:这段代码为啥结果是这样?
因为你修改的是 b 呀。
你没修改 b 绑定的那个东西。
跟 C 当然不一样,因为 C 里面的变量没有实体,只是一个名字,编译完就没有了,
变量就是内存地址,内存地址就是变量。
Python 里的变量是有实体结构的,变量和变量的值是两个结构,
绑定修改的是变量,而不是变量的值。
修改变量的值得用值的方法,比如 dict 这种值就有自己的方法可以用来修改值。
你用等号,永远修改的只是变量,不是变量的值。
【 在 feng321 的大作中提到: 】
: 既然是绑定,为何修改了b,a却没有被修改?这和c语言的引用不一样啊
--
修改:flw FROM 163.125.197.*
FROM 163.125.197.*
反正我记住了,修改简单的变量无所谓,但是修改复合变量,一连串的都修改了
【 在 flw 的大作中提到: 】
: 因为你修改的是 b 呀。
: 你没修改 b 绑定的那个东西。
:
--
FROM 117.136.116.*
你看我补充说明。
「修改」和「修改」不同。
你得看你修改的是什么。
【 在 feng321 的大作中提到: 】
: 反正我记住了,修改简单的变量无所谓,但是修改复合变量,一连串的都修改了
--
FROM 163.125.197.*
这个算是python的大坑了,参数的默认值是在函数定义时创建的,以后每次调用都用的同一个
可以理解成,参数的默认值是函数的一个property
这跟绝大多数其他语言都不一样
所以原则是,不要用空list、dict等作函数默认值,而是用None
【 在 iwannabe 的大作中提到: 】
: #!/usr/bin/env python3
: def foo(x: int, d: dict = {}) -> dict:
: if x == 0:
: ...................
--
FROM 115.171.108.*
一愣神,觉得简单变量的解释还挺合理
但太不 Python 了,还自创了术语
【 在 feng321 的大作中提到: 】
: 1)对于简单变量:
: >>> a=7
: >>> b=a
: ...................
--
FROM 117.143.147.*
其实就是 C++ 的引用!C 应该没有引用吧
【 在 feng321 的大作中提到: 】
: 既然是绑定,为何修改了b,a却没有被修改?这和c语言的引用不一样啊
--
FROM 117.143.147.*
核心的原因是: 函数默认值在函数定义时就产生了,不是每次调用时才产生,每次调用使用了同一个变量。
In [30]: def test(a=1, b=[]):
...: a += 3
...: b.append(1)
...: print(a,b)
...:
In [31]: test.__defaults__
Out[31]: (1, [])
In [32]: test()
4 [1]
In [33]: test.__defaults__
Out[33]: (1, [1])
In [34]: test()
4 [1, 1]
In [35]: test.__defaults__
Out[35]: (1, [1, 1])
【 在 iwannabe 的大作中提到: 】
: #!/usr/bin/env python3
: def foo(x: int, d: dict = {}) -> dict:
: if x == 0:
: ...................
--
修改:stockbsd FROM 120.229.48.*
FROM 120.229.48.*
记得看过一家互联网公司因为这个产生的bug倒闭了
【 在 iwannabe 的大作中提到: 】
: #!/usr/bin/env python3
:
: def foo(x: int, d: dict = {}) -> dict:
: if x == 0:
: return d
: d\[x\] = x
: return d
:
: def main():
:
: ..................
发自「今日水木 on HMA-AL00」
--
FROM 223.72.88.*
不过我觉得你这里其实还有个问题就是main里面的d和foo里面d重名吧?
【 在 iwannabe 的大作中提到: 】
: #!/usr/bin/env python3
: def foo(x: int, d: dict = {}) -> dict:
: if x == 0:
: ...................
--
FROM 222.71.112.*
【 在 easior 的大作中提到: 】
: 其实就是 C++ 的引用!C 应该没有引用吧
:
python这个和引用还真不一样
更像C++ 里的share ptr,
python里的赋值绑定会引起引用计数的增加,
C++的引用, 则只是一个别名,这个在编译层面存在的东西,实际生成代码里面都是代表同一个内存地址,
并不会额外产生引用计数的管理。
--
FROM 124.126.3.*