Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
157 views
in Technique[技术] by (71.8m points)

Python globals and keyword arguments

Why does test2() below print "True False"? I would expect "False False".

I expect test2() to change the global value EC to be False, so ec should also be False.

Why not?

Is there a straightforward way to get the "False False" behavior?

EC = True

def test1(ec=EC):
    print(ec, EC)

def test2():

    global EC
    EC=False

    test1()
question from:https://stackoverflow.com/questions/65837698/python-globals-and-keyword-arguments

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

First, that's a default value, not a keyword argument. If you want to pass keyword arguments, that would look like this:

def test1(ec):
    print(ec)

test1(ec=True)

Second, unlike most languages with default argument values, Python evaluates default values at function definition time, not function call time. This is an extremely unusual design decision that causes a lot of problems. The typical workaround is to use a sentinel value like None as the default, and compute the "real" default inside the function if the sentinel is detected:

EC = True

def test1(ec=None):
    if ec is None:
        ec = EC
    print(ec, EC)

def test2():

    global EC
    EC=False

    test1()

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...