ustone 发表于 2025-1-10 00:34:31

这个Python代码怎么理解?

如图:

cdhigh 发表于 2025-1-10 07:14:31

用来考试可以,实际工作中谁写成这样的代码马上会被打断腿。

这是python初学者常犯的错误:参数默认值使用可变对象。
在python中一切都是对象,函数也是一个对象,参数也是一个对象。
在执行func前,func对象已经在内存中被创建出来,ls列表对象同时也被创建出来了。
以后不管调用多少次,都会使用开始创建的func函数对象和ls列表对象。
这段代码基本等效于:
ls=[]
def func():
global ls
ls.append(1)
reurn ls


所以结果为:
,

为了避免这个副作用,默认参数一定不要使用可变对象,比如列表、字典等

如果函数内非得需要一个默认列表对象,可以修改为类似这样
def func(ls=None):
ls = ls or []
ls.append(1)
return ls

JuncoJet 发表于 2025-1-10 09:13:12




众所周知 Python 一个数值或者一个变量存储同一个地址
不使用 copy.copy 始终是浅拷贝

JuncoJet 发表于 2025-1-10 09:40:29

ustone 发表于 2025-1-10 16:20:49

cdhigh 发表于 2025-1-10 07:14
用来考试可以,实际工作中谁写成这样的代码马上会被打断腿。

这是python初学者常犯的错误:参数默认值使 ...

ls为参数为什么会等价于global的ls?
b=func() 函数调用参数为空,参数应该就是默认值的[ ]空列表,为什么这个空列表不空?

ustone 发表于 2025-1-10 16:23:37

cdhigh 发表于 2025-1-10 07:14
用来考试可以,实际工作中谁写成这样的代码马上会被打断腿。

这是python初学者常犯的错误:参数默认值使 ...

ls = ls or []
这行代码怎么理解?

ustone 发表于 2025-1-10 16:27:42

JuncoJet 发表于 2025-1-10 09:40


原代码a和b是同一个对象?

JuncoJet 发表于 2025-1-10 19:32:55

ustone 发表于 2025-1-10 16:27
原代码a和b是同一个对象?

是的         
页: [1]
查看完整版本: 这个Python代码怎么理解?