使用全局变量作为默认参数

时间:2011-07-14 07:10:58

标签: python

a.py

#!c:/Python27/python.exe -u

from connection import Connection
import globals

globals.server_ip = '192.168.0.1'
connection = Connection()

globals.py

#!c:/Python27/python.exe -u

server_ip = '127.0.0.1'

connection.py

import globals

class Connection:        
    def __init__(self, server_ip = globals.server_ip):
        print 'Connection is ' + server_ip + '\n'

我原以为我会被Connection is 192.168.0.1打印出来。但是,相反,正在打印Connection is 127.0.0.1

除非我尝试通过显式传递参数来构建连接(这不是我想要的,因为我不愿意在连接0参数上进行更改)

connection = Connection(globals.server_ip)

为什么会这样?我还能申请其他技术吗?

1 个答案:

答案 0 :(得分:11)

def __init__(self, server_ip=globals.server_ip):

创建方法时绑定参数,以后不再重新计算。 要使用当前值,请使用以下内容:

def __init__(self, server_ip=None):
    if server_ip is None:
        server_ip = globals.server_ip

顺便说一下,出于完全相同的原因,这样的功能很可能无法正常工作:

def foobar(foo=[]):
    foo.append('bar')
    return foo

在性能关键代码中,此行为也可用于避免对内置函数进行全局查找:

def highspeed(some_builtin=some_builtin):
    # in here the lookup of some_builtin will be faster as it's in the locals