gpt4 book ai didi

python - Python 命名空间的意外行为(2.7 和 3)

转载 作者:太空宇宙 更新时间:2023-11-03 19:07:23 25 4
gpt4 key购买 nike

Possible Duplicate:
“Least Astonishment” in Python: The Mutable Default Argument

我只是想检查我期望的工作方式是否正确。这是我正在编写的类的简化版本:

class Foo(object):
def __init__(self):
pass
def bar(self, test1=[], test2=[]):
if test2:
test1.append(1)
print test1

现在,对我来说,test1 和 test2(除非设置)在调用函数 bar 时应始终设置为空列表。这意味着当打印 test1 时,列表中应该只有一项(假设您只提供一项作为参数)。然而,事实并非如此:

>>> i = Foo()
>>> i.bar()
[]
>>> i.bar(test2=[1])
[1]
>>> i.bar()
[1, 1]
>>> i.bar(test2=[1])
[1, 1, 1]

在这种情况下,您希望使用整数得到类似的结果:

class Foo(object):
def __init__(self):
pass
def bar(self, test1=0, test2=0):
if test2:
test1 += 1
print test1

但这里,test1 始终设置为 0:

>>> i = Foo()
>>> i.bar()
0
>>> i.bar(test2=1)
1
>>> i.bar(test2=1)
1
>>> i.bar(test2=1)
1

看起来列表在函数或类的命名空间中是持久的,但整数却不是。

这可能是我的误解,所以希望得到一些澄清。

最佳答案

函数的默认参数是在声明函数时设置的,而不是每次调用函数时设置。因此,声明函数时创建的列表仅创建一次,并且每次调用该函数时都会引用该列表。另请参阅this question .

因为列表是可变的,所以当您更改它们时,引用它的任何内容也会发生变化。然而,整数是不可变的(它们无法更改),因此当您将一个变量重新分配给另一个整数时,只有该变量会发生变化,因为它引用的是一个不同的对象。

关于python - Python 命名空间的意外行为(2.7 和 3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14334922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com