例如,
def function(data=None):
print(data,id(data))
if data is None:
data=[]
print(data,id(data))
data.append(1)
print("==================")
function()
function()
>> None 1781798096
[] 1780266168520
==================
None 1781798096
[] 1780266174856
==================
首次执行function()
时,变量data
指的是"无" object(id:1781798096)代码的第三行,现在data
引用一个空列表对象(id:1780266168520)。function
的第二次执行,data
预计会有id值1780266168520.但令人惊讶的是,它给出了1781798096,当data
引用"无"时,它是相同的值。对象
但是如果我们将默认参数更改为某个任意列表,请说[0],
[0] 1780266149960
[0] 1780266149960
==================
[0, 1] 1780266149960
[0, 1] 1780266149960
==================
我们发现它给出了相同的id值。
所以我的问题是为什么我们不能修改之前提及的变量"无"对象以及为什么如果我们将默认参数设置为"无"和[0]?
答案 0 :(得分:3)
如果你问为什么data
的{{1}}值最初是相同的,那么这是因为默认参数在定义函数时初始化一次,并保持整个计划。这也是"Least Astonishment" and the Mutable Default Argument。
重新分配id
时,所有发生的事情都是它指向一个新对象(空列表),并且该对象可能有也可能没有data
(REPL会话经常重用相同的id
垃圾收集变量)。
答案 1 :(得分:0)
None是单例对象,因此不应创建NoneType的多个对象。 (注意,您可以创建单个类的多个对象)。在python中,你不总是改变它所拥有的值,你在对象上调用方法,修改它或创建新对象并为变量分配引用。以前它持有对None的引用,当你更改它时,它对其他对象的保持引用。当你再次分配None时,python初始化参考值,参考None。
答案 2 :(得分:0)
您在没有参数的情况下调用函数,因此在输入None
时将其设置为function()
。
如果您想保留data
的值,则需要返回data
变量,然后在第二次调用中将其传递给function()
。