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

Che*_*eng 6 python

a.py

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

from connection import Connection
import globals

globals.server_ip = '192.168.0.1'
connection = Connection()
Run Code Online (Sandbox Code Playgroud)

globals.py

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

server_ip = '127.0.0.1'
Run Code Online (Sandbox Code Playgroud)

connection.py

import globals

class Connection:        
    def __init__(self, server_ip = globals.server_ip):
        print 'Connection is ' + server_ip + '\n'
Run Code Online (Sandbox Code Playgroud)

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

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

connection = Connection(globals.server_ip)

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

Thi*_*ter 11

def __init__(self, server_ip=globals.server_ip):
Run Code Online (Sandbox Code Playgroud)

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

def __init__(self, server_ip=None):
    if server_ip is None:
        server_ip = globals.server_ip
Run Code Online (Sandbox Code Playgroud)

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

def foobar(foo=[]):
    foo.append('bar')
    return foo
Run Code Online (Sandbox Code Playgroud)

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

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