使用全局变量作为默认参数
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
。
除非我明确地传入参数来建立连接(但我不想这样做,因为我不想再对没有参数的 Connection 进行任何更改)。
connection = Connection(globals.server_ip)
这是为什么呢?有没有其他的方法可以尝试?
1 个回答
15
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