Python全局变量和关键字参数



为什么test2()下面打印" True " false " ?我希望&;False &;;

我期望test2()将全局值EC更改为False,因此ec也应该为False。

为什么不呢?

是否有一种直接的方法来获得&;False &;False &;行为?

EC = True
def test1(ec=EC):
print(ec, EC)
def test2():
global EC
EC=False
test1()

函数默认绑定在Function定义,而不是Function调用。对于像bool这样的不可变类型,在定义test1之后对EC做任何操作都不会影响绑定到test1ec参数的默认值。

如果你想要调用时间绑定,你必须接受一个哨兵默认值,并动态加载以响应获取它,例如:

def test1(ec=None):
if ec is None:
ec = EC
...

如果None可能是一个有效的参数(因此不能用作哨兵值),您可以创建和使用您自己的哨兵对象,而不是用于其他目的:

_test1_sentinel = object()  # Cheapest way to make new, guaranteed unique object
def test1(ec=_test1_sentinel):
if ec is _test1_sentinel:
ec = EC
...

首先,这是一个默认值,而不是关键字参数。如果你想传递关键字参数,就像这样:

def test1(ec):
print(ec)
test1(ec=True)

第二,与大多数具有默认参数值的语言不同,Python在函数定义时计算默认值,而不是在函数调用时。这是一个非常不寻常的设计决策,会导致很多问题。典型的解决方法是使用像None这样的哨兵值作为默认值,并计算"real";如果检测到哨兵,则函数内部的默认值:

EC = True
def test1(ec=None):
if ec is None:
ec = EC
print(ec, EC)
def test2():
global EC
EC=False
test1()

为什么会这样?

我认为你的问题是这样的:

  • 当您创建变量EC时,它将留在内存中的位置A。
  • 当你创建test1()函数时,它会留在位置b。
  • 当你创建test2()函数时,它会留在c位置。

假设:在test2()中,您将EC设置为全局变量,它运行,但将global EC保存在位置D中,在test2()的末尾,EC从D获得其值

这意味着当你在test2()中调用test1()时,设置为ec的EC留在A中,而不是D中,但是当你打印时,它会在内存中查找D。

我的解决方案
EC = True
def test1(ec=EC):
print(ec, EC)
def test2():
global EC
EC = False
test1(ec=EC)

这是我的代码,它可以在Python 3.6.9下工作

我的证明为了理解这一点,在Python中有两个内置函数是hex()id(),所以当你想找到你的变量在内存中的位置时,你可以通过hex(id(EC))

检查你可以这样运行代码:

EC = True
print(hex(id(EC)))
def test1(ec=EC):
print(ec, EC)
print(hex(id(test1)))
def test2():
global EC
EC = False
print(hex(id(EC)))
test1()
print(hex(id(test2)))

你会发现你的global EC&第一个EC变量停留在2个不同的位置。这就是为什么你得到True False

的结果

最新更新