为什么不能以前提到的变量"无"被修改?

时间:2017-08-26 07:10:48

标签: python function parameters nonetype

例如,

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]?

3 个答案:

答案 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()