开发者

Using global variable as default parameter

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'

I was expecting I will be getting Connection is 192.168.0.1 being printed. But, instead, Connection is 127.0.0.1 is be开发者_如何学Pythoning printed.

Unless I try to construct the connection by passing in the parameter explicitly (which is not something I wish to, as I am reluctant to make change any more on Connection with 0 parameter)

connection = Connection(globals.server_ip)

Why is this so? Is there any other techniques I can apply?


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

The argument is bound when the method is created and not re-evaluated later. To use whatever is the current value, use something like this:

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

Btw, for exactly the same reason a function like this would be likely to not work as intended:

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

In performance-critical code this behaviour can also be used to avoid global lookups of builtins:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜