为什么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
做任何操作都不会影响绑定到test1
的ec
参数的默认值。
如果你想要调用时间绑定,你必须接受一个哨兵默认值,并动态加载以响应获取它,例如:
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