Python 可变参数(mutable variable)默认参数陷阱及讨论

本文探讨了Python中使用可变参数(mutable variable)作为默认参数时出现的陷阱,解释了为何多次调用函数会导致默认参数被意外修改。为避免该问题,建议在定义函数时采用传递空对象的方式初始化默认参数。这种设计源于Python中函数作为一等公民的特性,使得默认参数的行为类似于其他对象的成员变量,其状态会随调用而变化。

Python 可变参数(mutable variable)默认参数陷阱及讨论

现象

阅读《Intermediate python》时,遇到一个之前忽略的问题:使用mutable variable作为函数的默认参数,下面是example:

def add_to(v, target=[]):
    target.append(v)
    return target
add_to(1)
add_to(2)
r = add_to(3)
print(r)  # [1, 2, 3]

在上面这个例子中,调用add_to()函数多次,将把1、2、3的结果添加到target中,熟悉其他编程语言的同学可能会同样觉得这与预期结果不符。

为什么会这样?

先简单说明一下为什么会出现这种结果:在python中函数的默认参数在定义时确定,而不是每次调用时初始化值,如果不显示的对默认参数赋值,那么使用的是在编译时确定的对象。下面是Python Common Gotchas中摘录的原因解释:

Python’s default arguments are evaluated once when the function is
defined, not each time the function is called (like it is in say,
Ruby). This means that if you use a mutable default argument and
mutate it, you will and have mutated that object for all future calls
to the function as well.

如何避免?

那么如何避免默认参数的陷阱呢?可以将上述代码改为如下格式:


                
在 Windows 系统中,环境变量分为两种类型:**用户环境变量**和**系统环境变量**。用户环境变量仅影响当前用户,而系统环境变量则影响所有用户。获取和修改可变的环境变量通常涉及对注册表或系统 API 的操作。 ### 获取环境变量 在 Windows 中,可以通过 `GetEnvironmentVariable` API 获取环境变量的值。此函数允许从当前进程中读取环境变量的值,适用于临时变量或持久化变量。 示例代码(使用 Python 获取环境变量): ```python import os # 获取某个环境变量的值 path = os.environ.get('PATH') print(f"Current PATH: {path}") ``` ### 修改环境变量 若需要修改持久化的环境变量(用户或系统级别),可以通过 `SetEnvironmentVariable` API 或直接修改注册表项。环境变量通常存储在以下注册表路径中: - **用户环境变量**:`HKEY_CURRENT_USER\Environment` - **系统环境变量**:`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment` 修改后,可能需要发送 `WM_SETTINGCHANGE` 消息以通知系统更新环境变量。 示例代码(使用 Python 修改用户环境变量并更新系统): ```python import os import winreg # 修改用户环境变量 key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, 'Environment', 0, winreg.KEY_SET_VALUE) winreg.SetValueEx(key, 'MY_VAR', 0, winreg.REG_SZ, 'MyValue') winreg.CloseKey(key) # 广播环境变量更改 import ctypes ctypes.windll.user32.SendMessageTimeoutW( 0xFFFF, # HWND_BROADCAST 0x1A, # WM_SETTINGCHANGE 0, 'Environment', 0x0002, # SMTO_ABORTIFHUNG 5000 ) ``` ### 注意事项 - 修改系统环境变量时,需要管理员权限。 - 某些环境变量(如 `PATH`)有长度限制,需注意拼接方式。 - 在修改环境变量后,新值可能不会立即生效,需重启应用程序或系统以应用更改[^1]。 ### 常见问题 如果用户无法获取或修改环境变量,可能是由于以下原因: - 权限不足,无法访问注册表或调用系统 API。 - 环境变量被设置为只读。 - 操作过程中未正确广播更改,导致系统未更新环境变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值