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

9 投票
1 回答
6369 浏览
提问于 2025-04-16 21:29

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

撰写回答